﻿<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>egomesbrandao, blog &#187; c#</title>
	<atom:link href="http://egomesbrandao.net/blog/tag/c/feed/" rel="self" type="application/rss+xml" />
	<link>http://egomesbrandao.net/blog</link>
	<description>.net, scrum, scripts e afins...</description>
	<lastBuildDate>Tue, 23 Feb 2010 21:31:26 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>ABC App &#8211; 03 Fazendo um Refactoring na DAL</title>
		<link>http://egomesbrandao.net/blog/2009/11/abc-app-03-fazendo-um-refactoring-na-dal/</link>
		<comments>http://egomesbrandao.net/blog/2009/11/abc-app-03-fazendo-um-refactoring-na-dal/#comments</comments>
		<pubDate>Wed, 04 Nov 2009 16:42:55 +0000</pubDate>
		<dc:creator>egomesbrandao</dc:creator>
				<category><![CDATA[Sem categoria]]></category>
		<category><![CDATA[abcapp]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[entlib]]></category>

		<guid isPermaLink="false">http://egomesbrandao.net/blog/?p=90</guid>
		<description><![CDATA[No post anterior,  iniciamos a contrução da ABC App, construindo uma camada de Domínio e uma camada de DAL. Antes de continuarmos a desenvolver, vamos aplicar um Refactoring?
Eu não gosto de termos em inglês para coisas que podemos falar em português, mas no caso do Refactoring eu abro uma exceção, normalmente o que se fala [...]]]></description>
			<content:encoded><![CDATA[<p>No <a href="http://egomesbrandao.net/blog/2009/10/abc-app-02-populando-objetos-sem-uso-de-dataset/" target="_blank">post anterior</a>,  iniciamos a contrução da ABC App, construindo uma camada de Domínio e uma camada de DAL. Antes de continuarmos a desenvolver, vamos aplicar um <em>Refactoring</em>?</p>
<p>Eu não gosto de termos em inglês para coisas que podemos falar em português, mas no caso do <em>Refactoring</em> eu abro uma exceção, normalmente o que se fala é Refatoração, mas essa palavra para mim é um termo matemático. O correto, IMHO, seria dizer Re-fabricar, mas fico com o termo em inglês.</p>
<p>E o que podemos fazer?</p>
<p>Vamos seguir usando Baby Steps, daqui por diante pequenos passos, ou seja , faço <em>Refactoring</em> e testo, <em>Refactoring</em> e testo, então não corro o risco de fazer uma grande alteração e me perder no código alterado e o sistema não funcionar. A primeira coisa para alterar é a criação da conexão com o BD, como será recorrente em toda classe DAL, podemos criar um classe base que todas dessa camada herdem e,  assim,  centralizarmos o código. Então,  primeira coisa, crie uma classe BaseDAL, como abaixo:</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using System.Data;
using System.Data.Common;
using System.Resources;
using EntLib = Microsoft.Practices.EnterpriseLibrary.Data;

namespace ABCApp.DAL
{

    public abstract class BaseDAL
    {
        public EntLib.Database db { get; set; }

        public BaseDAL()
        {
            db = EntLib.DatabaseFactory.CreateDatabase(&quot;Connection String&quot;);
        }
    }
}
</pre>
<p><em>Listagem 01</em></p>
<p>A classe BaseDAL não poderá ser instanciada, só poderá ser herdada. Com isso, ganhamos um único ponto de conexão com o Banco de Dados, que será muito útil quando quisermos controlar um transação, outro ponto é no reuso de código. Para usarmos essa classe vamos herdar ela na classe Customer da DAL. Não se esqueça de apagar a linha indicada, pois agora usaremos o objeto Database da classe BaseDAL. Lembram-se do código abaixo?</p>
<pre class="brush: csharp;">
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using Domain = ABCApp.Domain;

using System.Data;
using System.Data.Common;
using System.Resources;
using Microsoft.Practices.EnterpriseLibrary.Data;

namespace ABCApp.DAL
{
    public class Customer : BaseDAL
    {
        public Domain.Customer GetCustomerById(int customerId)
        {
            //Apague a linha abaixo
            //Database db = DatabaseFactory.CreateDatabase(&quot;Connection String&quot;);

            string sql = &quot;select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer where customerid = @customerid&quot;;

            DbCommand cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, &quot;customerid&quot;, DbType.Int32, customerId);

            IDataReader dr = db.ExecuteReader(cmd);

            Domain.Customer c = new Domain.Customer();

            while (dr.Read())
            {
                c.CompanyName = dr[&quot;companyname&quot;].ToString();
                c.CustomerId = Convert.ToInt32(dr[&quot;customerid&quot;]);
                c.EmailAddress = dr[&quot;emailaddress&quot;].ToString();
                c.FirstName = dr[&quot;firstname&quot;].ToString();
                c.LastName = dr[&quot;lastname&quot;].ToString();
                c.MiddleName = dr[&quot;middlename&quot;].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr[&quot;modifieddate&quot;]);
                c.Phone = dr[&quot;phone&quot;].ToString();
            }

            if (!dr.IsClosed)
                dr.Close();

            return c;
        }
    }
}
</pre>
<p><em>Listagem 02</em></p>
<p>Se já tivéssemos escrito mais classes DAL, o impacto dessa alteração seria muito maior. Então , seguindo nossso mantra de pequenos passos, vamos executar o código e saber se ele continua funcionando como o esperado.<br />
Sendo o retorno igual ao que você tinha antes de modificar o código, então passamos neste <em>Refactoring</em>!<br />
Vamos continuar implementando outros métodos na nossa classe DAL, o próximo interessante é retornar uma coleção de clientes. Podemos retornar todos os clientes e basicamente o método seria o mesmo do anterior mas sem o parâmetro de <em>customerId</em> e sem a linha de parâmetro no <em>Command</em>, vou criar então o método <em>GetCustomers </em>e que irá me retornar uma lista tipada de objetos, segue:</p>
<pre class="brush: csharp;">
public IList&lt;Domain.Customer&gt; GetCustomers()
        {
            List&lt;Domain.Customer&gt; lstCustomers ;

            string sql = &quot;select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer&quot;;

            DbCommand cmd = db.GetSqlStringCommand(sql);

            IDataReader dr = db.ExecuteReader(cmd);

            lstCustomers = new List&lt;Domain.Customer&gt;();

            while (dr.Read())
            {
                Domain.Customer c = new Domain.Customer();

                c.CompanyName = dr[&quot;companyname&quot;].ToString();
                c.CustomerId = Convert.ToInt32(dr[&quot;customerid&quot;]);
                c.EmailAddress = dr[&quot;emailaddress&quot;].ToString();
                c.FirstName = dr[&quot;firstname&quot;].ToString();
                c.LastName = dr[&quot;lastname&quot;].ToString();
                c.MiddleName = dr[&quot;middlename&quot;].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr[&quot;modifieddate&quot;]);
                c.Phone = dr[&quot;phone&quot;].ToString();

                lstCustomers.Add(c);
            }

            if (!dr.IsClosed)
                dr.Close();

            return lstCustomers;
        }
</pre>
<p><em>Listagem 03</em></p>
<p>E para testar o código acima vamos escrever as seguintes linhas no nosso método <em>Main</em> no Projeto Console, logo abaixo da última linha já existente do nosso teste anterior:</p>
<pre class="brush: csharp;">
            IList&lt;Domain.Customer&gt; lstCustomer = dalCustomer.GetCustomers();

            foreach (Domain.Customer customer in lstCustomer)
            {
                System.Console.WriteLine(customer.CustomerId.ToString() + &quot; - &quot; + customer.FirstName.ToString() + &quot; &quot; + customer.LastName.ToString());
            }

            System.Console.ReadKey();
</pre>
<p><em>Listagem 04</em></p>
<p>O código acima chama o método da DAL e retorna uma coleção de Clientes. Se aparecerem  várias centenas de Clientes,  está certo!<br />
O código escrito até agora. Será que é possível aplicar um <em>Refactoring</em> para melhorar algo? Bom, tem algo bem evidente, uma duplicação de código, os dois métodos fazem a leitura do <em>DataReader</em> e populam um objeto <em>Customer</em>, e um deles ele adiciona a uma lista de objetos já que o retorno são vários. Podemos centralizar esse código para que quando for preciso adicionar uma nova Propriedade a classe <em>Customer</em> seja preciso alterar somente em um lugar, então vou criar o método <em>AdaptToList</em> que irá receber um <em>DataReader</em> e retornar uma lista tipada de <em>Customer</em>:</p>
<pre class="brush: csharp;">
public IList&lt;Domain.Customer&gt; AdaptToList(IDataReader dr)
        {

        }
</pre>
<p><em>Listagem 05</em></p>
<p>O código da listagem 05 está praticamente pronto. Mova o código que se encontra na listagem 03, da linha 11 até 27 para dentro do método <em>AdaptToList</em>, e adicione a última linha, conforme a listagem 06! E repare que na inicialização da coleção <em>Customer</em> a declaração estava em outra linha,  então acrescente o tipo antes.</p>
<pre class="brush: csharp;">
        public IList&lt;Domain.Customer&gt; AdaptToList(IDataReader dr)
        {
            List&lt;Domain.Customer&gt; lstCustomers = new List&lt;Domain.Customer&gt;();

            while (dr.Read())
            {
                Domain.Customer c = new Domain.Customer();

                c.CompanyName = dr[&quot;companyname&quot;].ToString();
                c.CustomerId = Convert.ToInt32(dr[&quot;customerid&quot;]);
                c.EmailAddress = dr[&quot;emailaddress&quot;].ToString();
                c.FirstName = dr[&quot;firstname&quot;].ToString();
                c.LastName = dr[&quot;lastname&quot;].ToString();
                c.MiddleName = dr[&quot;middlename&quot;].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr[&quot;modifieddate&quot;]);
                c.Phone = dr[&quot;phone&quot;].ToString();

                lstCustomers.Add(c);
            }

            return lstCustomers;
        }
</pre>
<p><em>Listagem 06</em></p>
<p>Para funcionar só é preciso chamar o método AdaptToList no método GetCustomers,  também alterei para que a lstCustomer fosse baseada em uma IList&lt;T&gt;, conforme a listagem abaixo:</p>
<pre class="brush: csharp;">
        public IList&lt;Domain.Customer&gt; GetCustomers()
        {
            IList&lt;Domain.Customer&gt; lstCustomers = null; 

            string sql = &quot;select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer&quot;;

            DbCommand cmd = db.GetSqlStringCommand(sql);

            IDataReader dr = db.ExecuteReader(cmd);

            lstCustomers = AdaptToList(dr);

            if (!dr.IsClosed)
                dr.Close();

            return lstCustomers;
        }
</pre>
<p><em>Listagem 07</em></p>
<p>Mais um pequeno passo, e mais um teste! Se rodou e continuou funcionando é por que o seu <em>Refactoring</em> foi bem feito! O que falta? Bem, se AdaptToList foi contruído para economizar código devemos usá-lo também no método GetCustomerById, mas nesse último método ele retorna apenas um Customer e não uma lista. Podemos então usar um artifício: pegar somente o primeiro item da lista para retornar, conforme listagem abaixo: </p>
<pre class="brush: csharp;">
public Domain.Customer GetCustomerById(int customerId)
        {
            IList&lt;Domain.Customer&gt; lstCustomers = null;

            string sql = &quot;select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer where customerid = @customerid&quot;;

            DbCommand cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, &quot;customerid&quot;, DbType.Int32, customerId);

            IDataReader dr = db.ExecuteReader(cmd);

            lstCustomers = AdaptToList(dr);

            if (!dr.IsClosed)
                dr.Close();

          �
            return ((lstCustomers != null) || (lstCustomers[0] != null)) ? lstCustomers[0] : null;
        }
</pre>
<p><em>Listagem 08</em></p>
<p>Na listagem 08 está o método <em>GetCustomerById</em> como deve ficar, a mudança do <em>List&lt;Domain.Customer&gt;</em> para <em>IList&lt;Domain.Customer&gt;</em>, a chamada do método <em>AdaptToList</em> e o pulo do gato que é o uso do operador ternário para retornar somente o primeiro item da coleção, ou seja um objeto <em>Customer</em>, ou um <em>null</em>, não vamos discutir agora se retornar nulo é uma boa opção ou não!</p>
<p>Vou finalizar o post por aqui, para não ficar muito grande, resumindo o que fizemos aqui: Refactoring!<br />
Melhoramos o nosso código, parece que não é necessário fazer isso agora, mas sempre que possível é interessante a fazer, no caso criamos uma classe para cuidar inicialmente da conexão com o banco de dados e como criamos outro método que populava a classe <em>Customer </em>criamos um método para cuidar especificamente disso.</p>
<p>O código deste post encontra-se no <a href="http://abcapp.codeplex.com/SourceControl/changeset/view/35524" target="_blank">Change Set 35524</a>, dúvidas e sugestões por favor comentem!</p>
<p>Referências:</p>
<p><a href="http://pt.wikipedia.org/wiki/Refatora%C3%A7%C3%A3o" target="_blank">Wikipedia Refatoração</a></p>
<p><a href="http://en.wikipedia.org/wiki/Refactoring" target="_blank">Wikipedia Refactoring</a></p>
<p><a href="http://en.wikipedia.org/wiki/Code_refactoring" target="_blank">Wikipedia Code Refactoring</a></p>
]]></content:encoded>
			<wfw:commentRss>http://egomesbrandao.net/blog/2009/11/abc-app-03-fazendo-um-refactoring-na-dal/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>ABC App &#8211; 02 Populando objetos sem uso de Dataset</title>
		<link>http://egomesbrandao.net/blog/2009/10/abc-app-02-populando-objetos-sem-uso-de-dataset/</link>
		<comments>http://egomesbrandao.net/blog/2009/10/abc-app-02-populando-objetos-sem-uso-de-dataset/#comments</comments>
		<pubDate>Tue, 27 Oct 2009 19:15:49 +0000</pubDate>
		<dc:creator>egomesbrandao</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[abcapp]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[entlib]]></category>
		<category><![CDATA[oo]]></category>

		<guid isPermaLink="false">http://egomesbrandao.net/blog/?p=65</guid>
		<description><![CDATA[Finalmente começando o código mesmo!
Objetivo: Popular um objeto simples com dados do banco sem fazer uso de Dataset
O que é necessário: Visual C# Express, MS SQL Express 2K8, banco de exemplo Adventure Works 2K8, MS Enterprise Library 4.1
Preparando o ambiente: Para quem nunca instalou o banco de exemplo Adventure Works, ele se encontra no CodePlex neste [...]]]></description>
			<content:encoded><![CDATA[<p>Finalmente começando o código mesmo!</p>
<p>Objetivo: Popular um objeto simples com dados do banco sem fazer uso de Dataset</p>
<p>O que é necessário: Visual C# Express, MS SQL Express 2K8, banco de exemplo Adventure Works 2K8, MS Enterprise Library 4.1</p>
<p>Preparando o ambiente: Para quem nunca instalou o banco de exemplo Adventure Works, ele se encontra no <a href="http://www.codeplex.com/" target="_blank">CodePlex</a> neste link <a href="http://msftdbprodsamples.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=34032" target="_blank">aqui</a>, mas tem uma pegadinha! Se não instalou o SQL Express Advanced, é um download maior, você não tem SQL Full Text Filter (veja se tem no Configuration Manager do SQL, é um serviço) e daí a instalação automática das bases de dados vai falhar, você terá que rodar os scripts manualmente, mas vai ter que alterar algumas variáveis. Então é melhor você ter a versão SQL Full Text Search, que está <a href="http://www.microsoft.com/express/sql/download/" target="_blank">aqui</a>. Usaremos somente o LT, que é mais enxuto em quantidade de tabelas, mas totalmente compatível com sua versão completa.<br />
Quanto à MS Enterprise Library 4.1, ela é encontrada <a href="http://entlib.codeplex.com/" target="_blank">aqui</a>, quando terminar o instalador vai perguntar se deseja compilar, responda Sim.</p>
<p>Pronto?</p>
<p>Se imaginarmos que estamos em um ambiente real de negócio nos já temos o BD, que é o Adventure Works, o que precisamos fazer é contruir uma classe de Customer (Cliente) que vai ser populada com os dados da tabela Customer do BD, dentro de um projeto Class Library que eu chamei de ABCApp.Domain:</p>
<pre class="brush: csharp;">
namespace ABCApp.Domain
{
    public class Customer
    {
        public int CustomerId { get; set; }
        public string FirstName { get; set; }
        public string MiddleName { get; set; }
        public string LastName { get; set; }
        public string CompanyName { get; set; }
        public string EmailAddress { get; set; }
        public string Phone { get; set; }
        public DateTime ModifiedDate { get; set; }
    }
}
</pre>
<p>Como o nosso objetivo aqui é não usar Dataset e também agora não iremos usar ORM (não sabe o que é? espere próximos posts), vamos usar ADO.Net, mas para facilitar as coisas vamos usar a MS Enterprise Library (que chamarei daqui em diante de EntLib). Vamos criar então um novo projeto que será a nossa DAL, Data Access Layer, camada de acesso a dados:</p>
<pre class="brush: csharp;">
using ABCApp.Domain;

using Microsoft.Practices.EnterpriseLibrary.Data;

namespace ABCApp.DAL
{
    public class Customer
    {
        public Customer GetCustomerById(int customerId){

        }
    }
}
</pre>
<p>Repare que eu já adicionei duas referências, uma à EntLib, na janela Add Reference procure por Enterprise Library Data Access Application Block; e adicionei uma referência ao meu projeto ABCApp.Domain.<br />
A primeira é para poder usar o bloco de acesso a dados da EntLib, e isso só vai ocorrer nesse projeto de DAL, que é minha camada de acesso a dados, a camada de Domain não vai saber onde os dados estão sendo persistidos!<br />
E a segunda referência é porque o objeto que eu quero popular está na camada de domínio da aplicação.</p>
<p>Antes de continuarmos escrevendo a DAL, precisamos configurar como a EntLib irá fazer a conexão com o BD, e antes de fazermos isso precisamos adicionar um novo projeto a <em>Solution</em>, vamos adicionar um projeto do tipo <em>Console</em> para testarmos o código, por hora, por que existem maneiras melhores de fazer isso, mas não será feito nesse post. A <em>Solution</em> deverá ficar assim:</p>
<div id="attachment_76" class="wp-caption aligncenter" style="width: 224px"><img class="size-full wp-image-76" title="Solution" src="http://egomesbrandao.net/blog/wp-content/uploads/2009/10/Solution.PNG" alt="A Solution deverá estar parecida com essa figura" width="214" height="311" /><p class="wp-caption-text">A Solution deverá estar parecida com essa figura</p></div>
<p>Insira um arquivo do tipo App.config no novo projeto, é nele que iremos configurar a conexão com o BD, e para isso existe uma ferramente que é integrada ao VS.Net no momento da instalação da EntLib, mas como estou fazendo na versão Express vamos usar a ferramenta externa que também é instalada, procure no menu Inicar: Microsoft Patterns &amp; Practices &gt; Enterprise Library 4.1 &#8211; October 2008 &gt; Enterprise Library Configuration, e você terá a seguinte tela:</p>
<p> <img class="aligncenter size-full wp-image-80" title="EntLibConfiguration" src="http://egomesbrandao.net/blog/wp-content/uploads/2009/10/EntLibConfiguration.PNG" alt="EntLibConfiguration" width="1035" height="267" /></p>
<p>Quando abrir a janela, vá em <em>File &gt; Open</em>, e procure pelo arquivo <em>App.config</em> criado no projeto <em>Console</em>. Na pasta Connection String você pode criar várias conexões, mas no momento só precisamos de uma, apague as outras e crie uma nova, do lado direito da tela em <em>General &gt; ConnectionString</em> preencha com as informações de localização do SQL Express, BD, senha, &#8230; o padrão. Salve o arquivo, feche, e ao voltar ao VS.Net Express ele vai pedir para recarregar o arquivo <em>App.config</em>, se ele ficou aberto.</p>
<p>Agora finalmente vamos codificar o acesso ao BD, segue abaixo.</p>
<pre class="brush: csharp;">
using Domain = ABCApp.Domain;

using System.Data;
using System.Data.Common;
using System.Resources;
using Microsoft.Practices.EnterpriseLibrary.Data;

namespace ABCApp.DAL
{
    public class Customer
    {
        public Domain.Customer GetCustomerById(int customerId)
        { �
            Database db = DatabaseFactory.CreateDatabase(&quot;Connection String&quot;);

            string sql = &quot;select customerid, firstname, middlename, lastname, companyname, emailaddress, phone, modifieddate from saleslt.customer where customerid = @customerid&quot;;

            DbCommand cmd = db.GetSqlStringCommand(sql);

            db.AddInParameter(cmd, &quot;customerid&quot;, DbType.Int32, customerId);

            IDataReader dr = db.ExecuteReader(cmd);

            Domain.Customer c = new Domain.Customer();

            while (dr.Read())
            {
                c.CompanyName = dr[&quot;companyname&quot;].ToString();
                c.CustomerId = Convert.ToInt32(dr[&quot;customerid&quot;]);
                c.EmailAddress = dr[&quot;emailaddress&quot;].ToString();
                c.FirstName = dr[&quot;firstname&quot;].ToString();
                c.LastName = dr[&quot;lastname&quot;].ToString();
                c.MiddleName = dr[&quot;middlename&quot;].ToString();
                c.ModifiedDate = Convert.ToDateTime(dr[&quot;modifieddate&quot;]);
                c.Phone = dr[&quot;phone&quot;].ToString();
            }

            if (!dr.IsClosed)
                dr.Close();

            return c;
        }
    }
}
</pre>
<p>Explicando o código acima</p>
<p>Primeiramente repare nos <em>Using</em>, eu acrescentei uma referência ao projeto ABCApp.Domain, pois é lá que esta a classe que eu quero popular; e ao System.Data e System.Data.Common, pois vou usar o objeto <em>Command</em> e o <em>DataReader</em> do ADO.Net.<br />
Na linha 14 eu estou criando o &#8220;BD&#8221;, essa <em>DatabaseFactory</em> vai criar automáticamente uma <em>Connection</em> para mim, através da minha <em>ConnectionString</em> configurada, e através desse objeto vamos interagir com o BD. A vantagem é que a EntLib vai cuidar da conexão para a gente, abrir, fechar, e outras coisas!<br />
O objeto <em>Command</em> já é conhecido de quem já programou com ADO.Net, o legal aqui é que na linha 20 é criado um objeto de parâmetro, normalmente se concatenaria o código na string mas não é uma prática muito recomendada.<br />
A grande diferença aqui é o uso do <em>Data Reader</em>, como não estamos usando um <em>DataSet</em>, vamos puxar os dados do BD e popular um objeto, que é feito na linha 22, então é só ler o objeto dr e ir populando os dados depois de inicializado o nosso objeto de Domain.</p>
<p>Para testar é só escrever o código abaixo no <em>Main</em> do nosso projeto <em>Console</em>.</p>
<pre class="brush: csharp;">
static void Main(string[] args)
        {

            ABCApp.Domain.Customer c;

            ABCApp.DAL.Customer dalCustomer = new ABCApp.DAL.Customer();

            c = dalCustomer.GetCustomerById(1);
     �
            System.Console.WriteLine(c.CustomerId.ToString() + &quot; - &quot; + c.FirstName.ToString() + &quot; &quot; + c.LastName.ToString());

            System.Console.ReadKey();
        }
</pre>
<p>Qual a vantagem de usarmos isso tudo?</p>
<p>Bom, primeiramente estamos programando realmente em OO, temos um objeto de domínio, a camada de acesso a dados esta isolada do resto, e principalmente não estamos usando DataSet!</p>
<p>Se você quiser baixar o código esta disponível no <a href="http://abcapp.codeplex.com/" target="_blank">CodePlex &#8211; ABCApp</a> e baixe o <a href="http://abcapp.codeplex.com/SourceControl/changeset/view/33351" target="_blank">Change Set &#8211; 33351</a>.</p>
<p>No próximo post (assine o feed para acompanhar) vou mostrar o que podemos fazer de interessante tendo esse objeto de domínio e vou fazer um Refactoring para darmos uma melhorada no código já, pois a idéia aqui era mostrar mais o acesso através da EntLib e como fazer sem o uso de DataSet. Até lá!<br />
Críticas, sugestões, dúvidas são sempre bem-vindas, use o recurso de comentário do blog, a sua dúvida pode ser a de outro, e fica disponível para todos!</p>
]]></content:encoded>
			<wfw:commentRss>http://egomesbrandao.net/blog/2009/10/abc-app-02-populando-objetos-sem-uso-de-dataset/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ABC App &#8211; 01</title>
		<link>http://egomesbrandao.net/blog/2009/08/abcapp01/</link>
		<comments>http://egomesbrandao.net/blog/2009/08/abcapp01/#comments</comments>
		<pubDate>Tue, 25 Aug 2009 17:13:09 +0000</pubDate>
		<dc:creator>egomesbrandao</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[abcapp]]></category>
		<category><![CDATA[c#]]></category>
		<category><![CDATA[entlib]]></category>
		<category><![CDATA[oo]]></category>

		<guid isPermaLink="false">http://egomesbrandao.net/blog/?p=44</guid>
		<description><![CDATA[Ano passado comecei um projeto no CodePlex para mostrar o padrão MVC em Windows Forms para quem ainda não conhece. Mas o projeto ficou parado, mudei de .Net 2005 para .Net 2008 e o projeto não andou, esse ficou pesado, mas acho que é hora de começar me mexer!
Resolvi que não vou focar em MVC, [...]]]></description>
			<content:encoded><![CDATA[<p>Ano passado comecei um projeto no <a href="http://www.codeplex.com/" target="_blank">CodePlex</a> para mostrar o padrão MVC em Windows Forms para quem ainda não conhece. Mas o projeto ficou parado, mudei de .Net 2005 para .Net 2008 e o projeto não andou, esse ficou pesado, mas acho que é hora de começar me mexer!</p>
<p>Resolvi que não vou focar em MVC, vou usar o projeto para escrever sobre boas práticas, coisas que uso no meu dia- a-dia, então mudei o nome dele novamente (hehe) e ficou assim: ABC App.</p>
<p>Aqui no blog vou usar a categoria <a href="http://egomesbrandao.net/blog/category/abcapp/" target="_blank">abcapp</a> para publicar os posts referentes a essa série.</p>
<p>O código fonte deste projeto está hospedado no <a href="http://www.codeplex.com/">CodePlex</a> em <a href="http://abcapp.codeplex.com/" target="_blank">ABCApp</a>, e , como o projeto é para quem também está iniciando então vou usar as ferramentas Express da Microsoft, <a href="http://www.microsoft.com/express/vcsharp/" target="_blank">Visual C# Express 2008</a>. Vou usar também o <a href="http://tortoisesvn.net/">TortoiseSVN</a>, é só baixar o arquivo MSI e instalar. Antes , para acessar o CodePlex usando o TortoiseSVN era necessário o uso do  <a href="http://www.codeplex.com/SvnBridge">SvnBridge</a>, desenvolvido pela equipe do site, agora não é mais necessário. Todo o projeto tem uma URL para ele, do ABCApp é <a href="https://abcapp.svn.codeplex.com/svn" target="_blank"><strong>https://abcapp.svn.codeplex.com/svn</strong></a>.</p>
<p>Eu criei o projeto na pasta Projects que o VS.Net cria dentro da pasta Documentos do Usuário.</p>
<p>Depois que você instalou o TortoiseSVN é possível baixar em qualquer lugar o projeto, basta clicar com o botão direito do mouse dentro de uma pasta vazia, e escolher a opção <strong>&#8220;SVN Checkout&#8221; </strong>do menu de contexto.</p>
<p>Conforme o projeto for evoluindo é só atualizar o fonte, para isso clique com o botão direito do mouse dentro da pasta e escolha <strong>&#8220;SVN Update&#8221;.</strong><br />
<strong></strong><br />
Quem tem uma licença do VS.Net, pode baixar <a href="http://www.codeplex.com/CodePlex/Wiki/View.aspx?title=Obtaining%20the%20Team%20Explorer%20Client">aqui</a> o Team Explorer, ele não vai funcionar com as versões Express, infelizmente!</p>
<p>Para quem quer saber mais sobre o Subversion e Tortoise , saiu uma matéria na edição 07 de Fevereiro/Março da Mundo.Net, e <a href="http://svnbook.red-bean.com/">aqui</a> você pode baixar um livro sobre o Subversion.</p>
<p>Próximo post vou começar a desenvolver o aplicativo e vou começar a falar de uma maneira de desenvolver usando objetos de negócio acessando o banco de dados sem o uso de Dataset&#8217;s!</p>
]]></content:encoded>
			<wfw:commentRss>http://egomesbrandao.net/blog/2009/08/abcapp01/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
