﻿<?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/category/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; 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>A falácia do desenvolvimento em 3 camadas</title>
		<link>http://egomesbrandao.net/blog/2009/09/a-falacia-do-desenvolvimento-em-3-camadas/</link>
		<comments>http://egomesbrandao.net/blog/2009/09/a-falacia-do-desenvolvimento-em-3-camadas/#comments</comments>
		<pubDate>Thu, 10 Sep 2009 17:04:33 +0000</pubDate>
		<dc:creator>egomesbrandao</dc:creator>
				<category><![CDATA[.net]]></category>
		<category><![CDATA[abcapp]]></category>

		<guid isPermaLink="false">http://egomesbrandao.net/blog/?p=47</guid>
		<description><![CDATA[O desenvolvimento em 3 camadas, pedido em tantas vagas de emprego, em projetos de software, tanto discutido e difundido em fórums, livros e revistas de TI é uma verdadeira falácia!
falácia1
fa.lá.cia1
sf (lat fallacia) 1 Qualidade de falaz. 2 Engano, logro, burla. 3 Sofisma.
sofisma
so.fis.ma
sm (gr sóphisma) 1 Lóg Raciocínio capcioso, feito com intenção de enganar. 2 Argumento [...]]]></description>
			<content:encoded><![CDATA[<p>O desenvolvimento em 3 camadas, pedido em tantas vagas de emprego, em projetos de software, tanto discutido e difundido em fórums, livros e revistas de TI é uma verdadeira falácia!</p>
<blockquote><p><!-- /busca --><!-- conteudo --><label id="contents"></label><span>falácia<sup>1</sup></span><br />
<span>fa.lá.cia<sup>1</sup></span><br />
<span><em>sf</em> (<em>lat fallacia</em>) <strong>1 </strong>Qualidade de falaz.<strong> 2</strong> Engano, logro, burla.<strong> 3</strong> Sofisma.</span></p>
<p><!-- /busca --><!-- conteudo --><label id="contents"></label><span>sofisma</span><br />
<span>so.fis.ma</span><br />
<span><em>sm</em> (<em>gr sóphisma</em>)<strong> 1</strong><em> Lóg</em> Raciocínio capcioso, feito com intenção de enganar.<strong> 2</strong> Argumento ou raciocínio falso, com alguma aparência de verdade.<strong> 3</strong><em> pop</em> Dolo, engano, logro.</span></p></blockquote>
<p style="text-align: left;">Antes de começarmos a codificar alguma coisa, é bom um pouco de história para nos situarmos ! O termo foi difundindo erradamente. Vamos começar do começo e por partes, ou camadas , se preferir. <img src='http://egomesbrandao.net/blog/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> </p>
<p style="text-align: left;">Tive um primeiro contato com o termo desenvolvimento em camadas por volta do ano 2000. Na época, uma das linguagens mais usadas era o Visual Basic 6.0, o Java estava crescendo, e o Delphi era bem usado. A Microsoft recomendava o uso de ADO, presente no pacote MDAC, em detrimento ao DAO. O objetivo era ir no banco o mais tarde possível, pegar os dados e fechar a conexão o mais cedo possível. Surgiu então o 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 style="text-align: left;">A arquitetura Win DNA</p>
<p style="text-align: left;">A MS,  então,  comecou a divulgar a divisão de responsabilidades. A maioria dos programadores VB na época não usava nem o conceito de Classe, isso passou a ser mais demonstrado nos exemplos e no próprio livro, mas como o VB não era verdadeiramente OO não surtiu muito efeito. Até mesmo a divisão em DLL&#8217;s não era comum, o que mais se via eram executáveis gigantescos ou vários gigantescos por módulo!</p>
<p style="text-align: left;">O acesso aos dados era feito usando-se o RecordSet do ADO, criava-se um, ia no banco de dados, populava ele, fechava-se a conexão e usava na aplicação. A arquitetura,  então, era os Formulários (Form) no EXE e DLL&#8217;s;  A escrita do CRUD ficava em uma DLL. Na época,  a MS incentivava o uso massivo de Stored Procedures. E começou um movimento para tirar a lógica de negócios da camada de apresentação, ainda na fase dessa arquitetura era muito comum ter regras no banco de dados, mas falava-se em colocar essas regras em DLL&#8217;s também, então a camada de apresentação chamava uma DLL que continha algumas regras, que chamava a DLL de CRUD, que populava um RecordSet e retornava pela cadeia até a tela do usuário.</p>
<p style="text-align: left;">As coisas mudam no .Net</p>
<p style="text-align: left;">Com a vinda do .Net tivemos uma migração de algumas aplicações de maneira automática por meio de Wizards, alguns programadores também começaram a programar em VB.Net ou foram para o C#, uma linguagem mais de &#8220;gente grande&#8221; por ser mais parecida com Java. Porém,  o paradigma é diferente! VB 6.0 não é puramente OO, VB.Net sim! Aliás, o VB.Net é somente a sintaxe do VB 6.0, ele é uma linguagem em cima de outra plataforma.</p>
<p style="text-align: left;">Mas as pessoas são acostumadas a hábitos e,  o desenvolvimento em .Net foi feito da mesma maneira que vinha sendo feito no VB 6.0: lógica separada dos dados.</p>
<p style="text-align: left;">O paradigma OO nos diz: Cada classe determina o comportamento (definido nos métodos) e estados possíveis (atributos) de seus objetos, assim como o relacionamento com outros objetos. (fonte: <a href="http://pt.wikipedia.org/wiki/Orienta%C3%A7%C3%A3o_a_objetos" target="_blank">Wikipedia</a>)</p>
<p style="text-align: left;">Na arquitetura Win DNA os dados ficavam em um RecordSet e o comportamento em funções de uma classe em uma DLL, o RecordSet passeava pela aplicação e,  se ela fosse um controle de Estoque uma função recebia o RecordSet, percorria ele para ver se algum item estava zerado para gerar um novo pedido.</p>
<p style="text-align: left;">Na arquitetura OO não existe essa separação, o que eu quero mostrar com os próximos posts é que ao termos objetos de domínio, estamos facilitando o desenvolvimento por deixarmos tudo agrupado (comportamento + estado), a facilidade de manutenção será muito maior. Outra coisa, o uso de DataSet&#8217;s deixa o código também mais confuso, usando classes <a href="http://en.wikipedia.org/wiki/Plain_Old_CLR_Object" target="_blank">POCO</a> o código será muito mais fácil de entender e leve.</p>
<p style="text-align: left;">Continue acompanhando!</p>
]]></content:encoded>
			<wfw:commentRss>http://egomesbrandao.net/blog/2009/09/a-falacia-do-desenvolvimento-em-3-camadas/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>
