﻿<?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; .net</title>
	<atom:link href="http://egomesbrandao.net/blog/tag/net/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; 04 Exceções</title>
		<link>http://egomesbrandao.net/blog/2009/11/abc-app-04-excecoes/</link>
		<comments>http://egomesbrandao.net/blog/2009/11/abc-app-04-excecoes/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 20:01:15 +0000</pubDate>
		<dc:creator>egomesbrandao</dc:creator>
				<category><![CDATA[abcapp]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[camadas]]></category>
		<category><![CDATA[entlib]]></category>
		<category><![CDATA[exception]]></category>

		<guid isPermaLink="false">http://egomesbrandao.net/blog/?p=109</guid>
		<description><![CDATA[Ia deixar para escrever sobre o assunto depois, mas pra começar bem a semana vou usar o comentário do Tucaz e fazer um Refactoring no código e tratar Execeptions, ou Exceções!
exceção
ex.ce.ção
sf (lat exceptione) 1 Ato ou efeito de excetuar. 2 Desvio de regra, de lei, de princípio ou de ordem. 3 A coisa excetuada; aquilo [...]]]></description>
			<content:encoded><![CDATA[<p>Ia deixar para escrever sobre o assunto depois, mas pra começar bem a semana vou usar o comentário do <a href="http://blog.tucaz.net/" target="_blank">Tucaz</a> e fazer um <em>Refactoring</em> no código e tratar <em>Execeptions</em>, ou Exceções!</p>
<blockquote><p>exceção<br />
ex.ce.ção<br />
sf (lat exceptione) 1 Ato ou efeito de excetuar. 2 Desvio de regra, de lei, de princípio ou de ordem. 3 A coisa excetuada; aquilo que se desvia da regra. 4 Prerrogativa, privilégio. 5 Pessoa cujo modo de pensar ou de proceder se afasta do comum e usual. 6 Dir Alegação jurídica, constituindo defesa indireta (difere da contestação, que é defesa direta), pela qual o réu pretende baldar a ação intentada. E. declinatória, Dir: a que visa a declinar a competência do juiz ou tribunal ao qual foi apresentada a demanda. E. dilatória, Dir: a que pretende apenas demorar a demanda. E. peremptória, Dir: a que de todo e definitivamente afasta a demanda.</p></blockquote>
<p>Conforme a <a href="http://michaelis.uol.com.br/moderno/portugues/index.php?lingua=portugues-portugues&amp;palavra=exceção" target="_blank">definição acima do Michaelis</a>, exceção é um desvio da regra. Na classe Customer da camada de DAL, quando fazemos acesso ao banco de dados para buscar um ou mais usuários, a EntLib abre uma conexão e executa o comando Select, essa é a regra, mas e quando o banco de dados não esta disponível? Ou se alguém renomeou ou apagou a tabela que esta na nossa query? Isso são exceções, e se não tratarmos, o sistema para de funcionar! Para testar é só desligar o banco de dados (parando o serviço SQL Server Browser) e rodar o nosso software.</p>
<p>Existem várias correntes de pensamento sobre <em>Exceptions</em></p>
<p>Devemos tratar Exceptions como conexões a banco de dados, mas se um usuário do sistema cadastrar um número inválido de CPF devemos lançar uma <em>Exeception</em>? Devemos criar nossas próprias <em>Execeptions</em> para o nosso sistema? Onde devemos tratar? Muitas perguntas, algumas vão ficar sem respostas no momento, o objetivo desse post será fazer o <em>Refactoring</em>, e o primeiro será na conexão do banco.</p>
<p>Tratamento de <em>Exceptions</em></p>
<p>No .Net é usado a tríade Try-Catch-Finally, o código passível de erro e que pode vir a lançar uma exceção é colocado no bloco do Try, no Catch é onde se pegam as execeções, e o Finally serve para finalizar alguma operação, limpar alguma variável,  e, muitas vezes,  ele não é usado, mas no nosso primeiro exemplo já faremos uso dele.<br />
Uma regra que devemos sempre atentar é: nunca, NUNCA, colocar um método inteiro dentro de um bloco Try, não há necessidade de colocar criação de variáveis! Teste somente o que pode dar um erro. Além disso,  o código fica mais elegante.</p>
<p>No código da classe Customer da camada de DAL o que pode dar erro? O mais óbvio seria quando o DataReader estivesse sendo carregado, se nessa hora o banco de dados cair o nosso software vai pro espaço! Como no método AdaptToList ainda usamos o DataReader (ele fica aberto para popularmos o objeto Customer)  vamos colocar a linha de ExecuteReader e a de chamada do AdaptToLista dentro do Try. Para fazer isso,  vamos usar o recurso de <em>Refactoring</em> da IDE :  selecione as duas linhas, clique CTRL, e no menu de contexto escolha Surrond With&#8230;</p>
<div id="attachment_112" class="wp-caption aligncenter" style="width: 568px"><img class="size-full wp-image-112" title="ABC App 04 - Imagem01" src="http://egomesbrandao.net/blog/wp-content/uploads/2009/11/ABCApp04_Imagem01.png" alt="Fazendo um Surrond With no código" width="558" height="356" /><p class="wp-caption-text">Fazendo um Surrond With no código</p></div>
<p>Escolha a opção &#8220;tryf&#8221;, conforme figura abaixo, repare que este é um atalho para um Snippet, então quando estiver escrevendo código usando este atalho economiza tempo!</p>
<div id="attachment_113" class="wp-caption aligncenter" style="width: 561px"><img class="size-full wp-image-113" title="ABC App 04 - Imagem02" src="http://egomesbrandao.net/blog/wp-content/uploads/2009/11/ABCApp04_Imagem02.png" alt="Escolha &quot;tryf&quot;" width="551" height="249" /><p class="wp-caption-text">Escolha &quot;tryf&quot;</p></div>
<p>O código estará dentro do bloco Try, veja outras alterações no código abaixo e em seguida o por quê</p>
<pre class="brush: csharp;">
public Domain.Customer GetCustomerById(int customerId)
        {
            IDataReader dr = null;
            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);

            try
            {
                dr = db.ExecuteReader(cmd);
                lstCustomers = AdaptToList(dr);
            }
            catch (System.Data.SqlClient.SqlException exsql)
            {
                throw new Exception(exsql.Message);
            }
            catch {
            }

            finally
            {
                if (!dr.IsClosed)
                    dr.Close();
            }

            return ((lstCustomers != null) || (lstCustomers[0] != null)) ? lstCustomers[0] : null;
        }
}
</pre>
<p>Listagem 01</p>
<p>Movi a declaração do DataReader para o início do método, pois podemos deixar dentro do Try, já que o Finally não iria enxergar esse objeto e depois é só mover a linha que faz a verificação se o DataReader estiver aberto para dentro do Finally, ocorrendo ou não um erro o Finally sempre é executado e daí ele ficará responsável por fechar o DataReader.<br />
O Tucaz também fez um comentário sobre setar o CommandBehavior para CloseConnection, o que faria a conexão com o banco ser fechada após fecharmos o DataReader, mas a EntLib cuida disso pra gente! Veja o código fonte, e essa é a parte legal de usar essa biblioteca da MS, pois com o acesso ao fonte vemos as boas práticas sendo aplicadas, aquelas que se encontram no <a href="http://msdn.microsoft.com/en-us/library/ms978510.aspx" target="_blank">Guia de Acesso a Dados</a>.<br />
O Catch vazio vai pegar todo o tipo de exceção, então é bom especializarmos o Catch, por isso eu também coloquei para pegar a SQLException.</p>
<p><strong>Aplique esse <em>Refactoring</em> no método GetCustomers() também.</strong></p>
<p>OK&#8230; E vamos fazer isso também quando é criado o Database na classe BaseDAL, pois se o banco de dados estiver fora do ar vai dar um erro. É só executar os mesmos passos em cima da única linha que temos no único construtor da classe. E vai ficar assim:</p>
<pre class="brush: csharp;">
    public abstract class BaseDAL
    {
        public EntLib.Database db { get; set; }

        public BaseDAL()
        {
            try
            {
                db = EntLib.DatabaseFactory.CreateDatabase(&quot;Connection String&quot;);
            }
            catch (Exception ex)
            {
                throw ex;
            }
            finally
            {

            }
        }
    }
</pre>
<p>Listagem 02<br />
E agora temos que exibir esses erros lá na nossa interface de usuário, aqui vai o código de como vai ficar:</p>
<pre class="brush: csharp;">

namespace ABCApp.Console
{
    class Program
    {
        static void Main(string[] args)
        {

            ABCApp.Domain.Customer c;

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

            try
            {
                c = dalCustomer.GetCustomerById(1);
                System.Console.WriteLine(c.CustomerId.ToString() + &quot; - &quot; + c.FirstName.ToString() + &quot; &quot; + c.LastName.ToString());
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
            }

            System.Console.ReadKey();

            try
            {
                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());
                }
            }
            catch (Exception ex)
            {
                System.Console.WriteLine(ex.Message);
            }
         �
            System.Console.ReadKey();
        }
    }
}
</pre>
<p>Vamos testar? Para isso desligue o seu SQL Server! Vá no menu Iniciar &gt; Microsoft SQL Server 2008 &gt; Configuration Tools &gt; SQL Server Configuration Manager, entre na ferramenta.  Pare o serviço SQL Server Browser, daí não deve ser possível conectar na base. Rodando a aplicação devem ser impressas mensagens de erro onde deveriam aparecer dados!</p>
<p>Bom&#8230; Isso foi só para começarmos a colocar um controle sobre os locais onde podem ocorrer <em>Exceptions</em>, esse não é o mundo perfeito, e nem será a última vez que irei falar sobre o tema. Mas por que não ler alguns links sobre isso? Aí vai:</p>
<p><a href="http://unplugged.giggio.net/unplugged/post/Como-tratar-erros.aspx">http://unplugged.giggio.net/unplugged/post/Como-tratar-erros.aspx</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/dd203116.aspx">http://msdn.microsoft.com/en-us/library/dd203116.aspx</a> (Esse é sobre o bloco de Exceptions da EntLib, mais pra frente vamos usar ele)</p>
<p><a href="http://www.developerfusion.com/article/5250/exceptions-and-performance-in-net/">http://www.developerfusion.com/article/5250/exceptions-and-performance-in-net/</a> (discute a questão de performance ao lançar exceções)</p>
<p><a href="http://yoda.arachsys.com/csharp/exceptions2.html">http://yoda.arachsys.com/csharp/exceptions2.html</a> (também sobre performance)</p>
<p><a href="http://www.artima.com/interfacedesign/AbnormalConditions.html">http://www.artima.com/interfacedesign/AbnormalConditions.html</a></p>
<p><a href="http://apparch.codeplex.com/">http://apparch.codeplex.com/</a> (aqui tem um vídeo sobre o tema)</p>
<p>Fico por aqui&#8230; Na quinta-feira post sobre objetos anêmicos&#8230;</p>
<p>O código deste post esta no <a href="http://abcapp.codeplex.com/SourceControl/changeset/view/36605" target="_blank">Change Set 36605</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://egomesbrandao.net/blog/2009/11/abc-app-04-excecoes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>
		<item>
		<title>Padrão MVC  arquitetura em camadas</title>
		<link>http://egomesbrandao.net/blog/2009/07/padrao-mvc-arquitetura-em-camadas/</link>
		<comments>http://egomesbrandao.net/blog/2009/07/padrao-mvc-arquitetura-em-camadas/#comments</comments>
		<pubDate>Mon, 27 Jul 2009 15:59:14 +0000</pubDate>
		<dc:creator>egomesbrandao</dc:creator>
				<category><![CDATA[abcapp]]></category>
		<category><![CDATA[.net]]></category>
		<category><![CDATA[camadas]]></category>
		<category><![CDATA[mvc]]></category>

		<guid isPermaLink="false">http://egomesbrandao.net/blog/?p=22</guid>
		<description><![CDATA[(Nota: publiquei esse post inicialmente aqui, como movi o meu blog , e recebi pedidos para comentar mais a respeito, estou revisando e postando aqui para continuar a série de posts do blog antigo)
Estou desenvolvendo um novo sistema baseado na arquitetura MVC, ou melhor, pensei que estava.
Em 2007, participei da integração de um sistema legado [...]]]></description>
			<content:encoded><![CDATA[<p>(Nota: publiquei esse post inicialmente <a href="http://egomesbrandao.blogspot.com/2008/02/arquitetura-mvc-camadas.html">aqui</a>, como movi o meu blog , e recebi pedidos para comentar mais a respeito, estou revisando e postando aqui para continuar a série de posts do blog antigo)</p>
<p>Estou desenvolvendo um novo sistema baseado na arquitetura MVC, ou melhor, pensei que estava.</p>
<div>Em 2007, participei da integração de um sistema legado ASP.Net com SAP que estava sendo implantado. O sistema já estava construído e basicamente deveríamos integrá-lo ao SAP usando Web Services disponibilizados através do serviço XI da SAP. Ou seja, ao invés de continuar buscando os dados no banco de dados Oracle, iríamos agora buscar no SAP, através de Web Services.</div>
<p>O sistema usava a arquitetura MVC. Usava? Bom, eu tinha uma DLL onde ficavam as classes Model, outra de Controller, tinha a interface gráfica em ASP.Net, mas eram somente camadas&#8230; Opa, mas MVC não são camadas?</p>
<p>Esse foi o meu primeiro contato com MVC e a partir daí comecei a estudar mais sobre padrões e arquitetura, e lógico vi que era hora de me aprofundar em Orientação a Objetos&#8230; Sim isso mesmo, aprofundar.</p>
<p>Eu vim do VB6 (por favor, VB6 é sim uma linguagem de gente grande!), quando comecei a programar o ADO estava sendo lançado, praticamente. Logo em seguida tive contato com a arquitetura Win DNA (<a href="http://en.wikipedia.org/wiki/Windows_DNA">Windows Distributed interNet Applications Architecture</a>), como o link diz é um nome marketeiro para tecnologias que já existiam mas foram agrupadas em uma arquitetura (COM, COM+, antigo MTS; ADO, ActiveX, ASP). Na época a minha bíblia era o livro <a href="http://www.submarino.com.br/books_productdetails.asp?ProdTypeId=1&amp;ProdId=87125&amp;St=WL126213">Mary Kirtland</a>, posteriormente li também o livro do <a href="http://www.submarino.com.br/books_productdetails.asp?Query=ProductPage&amp;ProdTypeId=1&amp;ProdId=175540&amp;ST=SR">Fábio Câmara</a>.</p>
<p>E foi aí que surgiu para mim o conceito de camadas, dividir para conquistar, já que na época tínhamos o <a href="http://www.google.com/url?sa=t&amp;ct=res&amp;cd=3&amp;url=http%3A%2F%2Fen.wikipedia.org%2Fwiki%2FDLL_hell&amp;ei=v4KESPWgG5eY9QSh6fjXCw&amp;usg=AFQjCNGciKUK58PY7jcONulFc5rO0WkCmg&amp;sig2=22y6FMKMgwwjEfDaN-RKaw">DLL Hell</a>, era muito bom você criar pequenos componentes que sofreriam manutenção em separado, e nada melhor do que juntar esses componentes por funcionalidades! Assim os componentes usados para a interface gráfica ficavam juntos, o de acesso a dados ficavam em outro, o que diminuía a possibilidade de dar um problemão quando alguma coisa sofria manutenção, eu disse diminuía&#8230;</p>
<p>Daí pra frente eu só desenvolvia em camadas, camadas lógicas, pois na verdade o software ficava instalado todo na máquina cliente, ou seja, eram instaladas várias DLL&#8217;s, mas todas no mesmo lugar. Algum projeto saiu usando o COM+, aí tinhamos Tiers, componentes usados em interface gráfica ficava na máquina cliente e compoentes de negócio e banco de dados ficavam no servidor.</p>
<p>Mas onde entra o <a href="http://pt.wikipedia.org/wiki/MVC">MVC</a> aí? Aí é que está&#8230; Não entra!! O MVC não é sinônimo de desenvolvimento em camadas! Nem em tiers! O MVC é um padrão de arquitetura, e ele é baseado no comportamento dos objetos. Sim, comportamento!! E mais, o MVC é padrão para interface gráfica, e não para todo o sistema.<br />
Muitos de nós, principalmente que viemos do VB6, Win DNA, &#8230;; começamos desenvolvendo em OO criando classes que tem os atributos como os RecordSets do ADO, ou seja somente dados! Mas um objeto por definição possui comportamento. Então não adianta criar uma classe de dados, como se fosse um RecordSet, uma classe de serviço como se fosse uma classe do VB6 (que sim, antes que alguém fale, não é orientado a objeto, porém chegava perto&#8230;), e ficar passeando pelas camadas, que isso é MVC. Aliás nem OO é, pois você não estará usando comportamentos dos objetos.</p>
<p>Não vou chover no molhado explicando isso aqui, o <a href="http://blog.fragmental.com.br/">Phillip Calçado Shoes</a> já escreveu um artigo muito bom sobre isso, então usando um dos princípio de OO que é a reusabilidade , para saber mais leia os artigos <a href="http://www.fragmental.com.br/wiki/index.php/MVC_e_Camadas">MVC e Camadas</a> e <a href="http://www.fragmental.com.br/wiki/index.php/Evitando_VOs_e_BOs">Evitando VO&#8217;s e BO&#8217;s</a>, leia também as referências e acompanhe o blog dele! <img src='http://egomesbrandao.net/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> </p>
<p>Na edição 46 da <a href="http://www.devmedia.com.br/">.Net Magazine</a> o Rodrigo Sendin escreveu um artigo sobre MVC, porém quem leu o artigo e ler os artigos do Phillip Calçado vai entender que a crítica do Rodrigo esta errada quanto ao padrão MVC.</p>
<p>Bom se eu não vou explicar o que é MVC, nem camadas, nem BO ou VO, então pra que este post? Como eu disse estava desenvolvendo um projeto pensando estar usando MVC, no momento na versão 1.0 ele irá sair usando BO&#8217;s, trafegando pelas camadas, etc&#8230; Mas estou montando a arquitetura da versão 2.0 em MVC, não vou usar nenhum framework, pelo menos por enquanto.</p>
<p>No próximo post (espero mesmo começar aqui neste novo endereço do blog em breve) vou começar uma série de artigos compartilhando minha experiência, principalmente com uso de objetos <a href="http://en.wikipedia.org/wiki/Plain_Old_CLR_Object">POCO</a>, pois percebo que no Brasil o uso de DataSet&#8217;s é abusivo, logicamente para pequenos projetos é uma boa solução mas para projetos médios, ou com muitos acessos ao banco de dados o peso começa aumentar. E também vou dar um foco no acesso a dados. Vou publicar o código acho que no <a href="http://www.codeplex.com/">CodePlex</a><a href="http://code.msdn.microsoft.com/"></a> (o código esta <a href="http://abcapp.codeplex.com/">aqui</a>, ou melhor, estará <img src='http://egomesbrandao.net/blog/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' /> ), daí é só baixar o código para estudar ou começar outro projeto em cima. Quem quiser se unir a empreitada é só entrar em contato.</p>
<p>Espero que acompanhem, comentem, entrem em contato para trocarmos idéias.</p>
]]></content:encoded>
			<wfw:commentRss>http://egomesbrandao.net/blog/2009/07/padrao-mvc-arquitetura-em-camadas/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
