<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2portuguesetitles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>DevBrasil - Participe agora mesmo!</title><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/devbrasil" /><language>en</language><lastBuildDate>Fri, 24 Feb 2012 10:27:52 PST</lastBuildDate><feedburner:info uri="devbrasil" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><description>.NET; Visual Studio; ASP.NET; Silverlight; TFS e Windows Phone 7.</description><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevbrasil" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevbrasil" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevbrasil" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/devbrasil" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevbrasil" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Fdevbrasil" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Fdevbrasil" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:browserFriendly>Desenvolvendo para web usando o Visual Studio 2008 ASP.NET 3.5, AJAX, LINQ, Segurança, Silverlight, Web Mobile.</feedburner:browserFriendly><item><title>Capturar metadados de uma tabela usando recursos do ADO.NET</title><link>http://feedproxy.google.com/~r/devbrasil/~3/MpEUbFvsH6o/2307362:BlogPost:173924</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Yan de Lima Justino</dc:creator><pubDate>Fri, 24 Feb 2012 08:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-02-24:2307362:BlogPost:173924</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>A manipulação de estruturas de uma tabela de banco de dados pode algo comum quando um sistema se propõe a oferecer algum tipo de interação mais direta com o a estrutura da base de dados. Para tal tarefa, se faz necessário recuperar os metadados do banco. A recuperação destes metadados pode ser feita de várias formas. Geralmente, utilizamos recursos do próprio banco de dados para tal. Para quem deseja abstrair isto, o ADO.Net oferece uma forma rápida e fácil de se obter os metadados de uma tabela. Mostraremos aqui como fazer isto.<br/><br/></p>
<p>O processo é bem simples. Na instância de seus adapter basta utilizar o comando <strong>FillSchema</strong>. Veja o código abaixo:<br/><br/></p>
<p><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> <span style="font-family: 'courier new', courier;">FillDataTable(</span><span style="color: #0000ff;">out</span> <span style="color: #339966;">DataTable</span> <span style="font-family: 'courier new', courier;">table,</span> <span style="color: #339966;">DbCommand</span> <span style="font-family: 'courier new', courier;">command)</span></p>
<p><span style="font-family: 'courier new', courier;">{</span><br/> <span style="font-family: 'courier new', courier;">   <span style="color: #0000ff;">var</span> tableReturn = <span style="color: #0000ff;">new</span> <span style="color: #339966;">DataTable</span>();</span><br/> <span style="font-family: 'courier new', courier;">   <span style="color: #0000ff;">var</span> adapter = <span style="color: #0000ff;">new</span> <span style="color: #339966;">SqlDataAdapter</span>((SqlCommand)command);</span><br/> <span style="font-family: 'courier new', courier;">   adapter.Fill(tableRetorno);</span><br/> <span style="font-family: 'courier new', courier;">   <span>FillSchemasDaTaTable</span>(<span>tableReturn</span>, adapter);</span><br/> <span style="font-family: 'courier new', courier;">   table = tableRetorno;</span><br/> <span style="font-family: 'courier new', courier;">}</span></p>
<p><span style="font-family: 'courier new', courier;"><br/></span></p>
<p><span style="font-family: 'courier new', courier;"><span style="color: #0000ff;">private</span> static void FillSchemasDaTaTable(<span style="color: #339966;">DataTable</span> table, <span style="color: #339966;">SqlDataAdapter</span> adapter)</span><br/> <span style="font-family: 'courier new', courier;">{</span><br/> <span style="font-family: 'courier new', courier;">   adapter.FillSchema(<span>table</span>, SchemaType.Source);</span><br/> <span style="font-family: 'courier new', courier;">}</span></p>
<p><span style="font-family: 'courier new', courier;"><br/></span></p>
<p><span style="font-family: 'courier new', courier;"><br/></span></p>
<p>O código acima retorna um DataTable preenchido juntamente com os metadados. Em posse desta informação você pode varrer o <span style="color: #339966;">DataColumnCollection </span>contido no <strong>Table.Columns</strong>recuperando todos os seus atributos: como Nome da coluna, tamanho máximo, DataType etc. Veja o código a baixo:</p>
<p><span style="color: #0000ff;"><br/></span></p>
<p><span style="color: #0000ff;"><br/> public</span> <span style="color: #339966;">List</span><span>&lt;</span><span style="color: #0000ff;">string</span>&gt; Read(<span style="color: #339966;">DataTable</span>table)</p>
<p>{<br/>    <span style="color: #0000ff;">var </span>fields = new <span style="color: #008000;">List</span>&lt;<span style="color: #0000ff;">string</span>&gt;();</p>
<p><span style="color: #0000ff;">var</span>columns = table.Columns;</p>
<p> </p>
<p><span style="color: #0000ff;">for</span> (int i = 0; contador &lt; columns.Count; contador++)<br/>      fields.Add(colunas[i].ColumnName);</p>
<p> </p>
<p><span style="color: #0000ff;">return</span> fields;<br/> }<br/><br/></p>
<p>Concluindo este artigo, descobrimos que a manipulação de estruturas de uma tabela de banco de dados pode ser feita com os recursos do próprio ADO.Net, que oferece uma forma rápida e fácil de se obter os metadados de uma tabela.<br/><br/></p>
<p><strong>Para saber mais:</strong></p>
<p><strong><span style="color: #003366;"><a rel="nofollow" target="_self" href="http://devbrasil.net/group/cdesenvolvendores"><span style="color: #003366;">Aprofunde seus conhecimentos sobre este tema na comunidade C# (Csharp)</span></a></span></strong><br/> <strong><span style="color: #003366;"><a href="http://devbrasil.net/group/adonet" target="_self"><span style="color: #003366;">Aprofunde seus conhecimentos sobre este tema na comunidade ADO.NET</span></a></span></strong></p>
<p><span style="font-family: 'courier new', courier;"><br/></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/MpEUbFvsH6o" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;A manipulação de estruturas de uma tabela de banco de dados pode algo comum quando um sistema se propõe a oferecer algum tipo de interação mais direta com o a estrutura da base de dados. Para tal tarefa, se faz necessário recuperar os metadados do banco. A recuperação destes metadados pode ser feita de várias formas. Geralmente, utilizamos recursos do próprio banco de dados para tal. Para quem deseja abstrair isto, o ADO.Net oferece uma forma rápida e fácil de se obter os metadados de uma…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:173924</feedburner:origLink></item><item><title>Padrões de Projeto - Template Method</title><link>http://feedproxy.google.com/~r/devbrasil/~3/cac875CAVKA/2307362:BlogPost:169111</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Leandro Rodrigues</dc:creator><pubDate>Thu, 23 Feb 2012 18:44:43 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-02-24:2307362:BlogPost:169111</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>  </p>
<p>O Template Method é um Padrão de Projeto muito utilizado, bem provável que você já o implementou talvez sem se quer saber, ou que você futuramente o implementará, esse padrão possui uma abstração simples de assimilação o que torna o mesmo mais popular a grande comunidade de desenvolvedores , diferente de outros padrões de nível complexo.</p>
<p> </p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Qual é a proposta do Template Method? <a href="http://api.ning.com:80/files/MJkp5Juz*qCHvDTulMY6ApqItAG8ELSUysQEQYApx9wC20keeICv9O9D0glnmwbAYKSHEkuxfCn6swvhjMrTJv-fBBpFEQv5/template.jpg" target="_self"></a><a href="http://api.ning.com:80/files/MJkp5Juz*qCHvDTulMY6ApqItAG8ELSUysQEQYApx9wC20keeICv9O9D0glnmwbAYKSHEkuxfCn6swvhjMrTJv-fBBpFEQv5/template.jpg" target="_self"></a><a href="http://api.ning.com:80/files/MJkp5Juz*qCHvDTulMY6ApqItAG8ELSUysQEQYApx9wC20keeICv9O9D0glnmwbAYKSHEkuxfCn6swvhjMrTJv-fBBpFEQv5/template.jpg" target="_self"></a></span></strong></span></p>
<p> </p>
<p>O Template Method tem co<span class="font-size-4"><strong><span style="color: #008000;"><a href="http://api.ning.com:80/files/MJkp5Juz*qCHvDTulMY6ApqItAG8ELSUysQEQYApx9wC20keeICv9O9D0glnmwbAYKSHEkuxfCn6swvhjMrTJv-fBBpFEQv5/template.jpg" target="_self"></a></span></strong></span>mo proposta facilitar a implementação de cenários onde se deseja encapsular algoritmos, fornecendo as classes derivadas o poder de definir as pré-condições (input) do algoritmo e deixando a classe Base responsável pela estrutura do algoritmo, pré-condições globais que fazem sentido a todas classes deviradas, bem como, as pós-condições (output).</p>
<p> </p>
<p>A idéia básica por trás desse modelo é disponibilizar uma única classe base que ficará responsável pela estrutura do algoritmo, evitando ter "pedaços" do algoritmo espalhados pelas classes deviradas o que gera redundância no código, a classe derivada será responsável de implementar o algoritmo de forma independente, cada classe devirada implementará o algoritmo de uma forma diferente ou igual porém sempre respeitando a estrutura do algoritmo que estará definida na classe Base.</p>
<p> <strong> </strong></p>
<p><strong><span style="color: #008000;" class="font-size-4">Diagrama de classe de um Template Method</span> </strong></p>
<p> </p>
<p>Interessante observar que existe uma classe abstrata que será herdada pelas demais classes, sendo que dentro dessa classe abstrata nós temos um templateMethod() no corpo do templateMethod temos outros dois métodos que serão implementados pelas classes deviradas. </p>
<p><a href="http://api.ning.com:80/files/kSvvGsE2e8-WOA*kPxpQ4NXkhEp3XLo*wHRMmzu2UfsA-NfCWOW5I6uO08kYnwt8SCWMI0hBHCSF1YdLafCST8dH2jsQSGx-/TemplateMethod.jpg" target="_self"><img class="align-left" src="http://api.ning.com:80/files/kSvvGsE2e8-WOA*kPxpQ4NXkhEp3XLo*wHRMmzu2UfsA-NfCWOW5I6uO08kYnwt8SCWMI0hBHCSF1YdLafCST8dH2jsQSGx-/TemplateMethod.jpg" width="413"/></a> </p>
<p><br/>  </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Contextualizando com a realidade</span></strong></span></p>
<p> </p>
<p>Como o objetivo principal desse padrão é encapsular algoritmo, nada melhor que definir um processo.</p>
<p>Existe uma Empresa em São Paulo chamada "Docearia DevBrasil" sua especialidade é fazer bolos, porém devida a desorganização os bolos estão saindo diferentes, ou seja, você compra um bolo de chocolate hoje o sabor é x e se você comprar amanhã o mesmo bolo o sabor é y, isso acontece porque dentro da docearia existem 2 funcionários (Padeiro e Confeiteiro) que fazem bolos de chocolate e cada um faz de uma forma.</p>
<p>O Departamento de Marketing constatou o problema e para evitar o declínio do negócio pediu uma automação desse processo com extrema urgencia ao Departamento de TI. </p>
<p> </p>
<p>Depois de uma longa conversa a equipe de TI, resolveu mudar o processo que obrigou o Padeiro, Confeiteiro ou qualquer outro funcionário (Classe Derivada) da docearia a seguir um modelo de fazer bolo(template method) estabelecido por uma cartilha (Classe Base) para fazer um bolo.</p>
<p> </p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Observando esse processo pela ótica OO</span></strong></span></p>
<p> </p>
<p><a href="http://api.ning.com:80/files/zcN4*xGdgtQU6isBQjPUdCetKdfFhW7vBZ8sPUdEz-gNZCbNJZIBBSwwPq0B1B4rp7onQRG3WnwjDDCmHIcWppb*zr8uKb9x/TemplateMethodSolution.jpg" target="_self"><img class="align-left" src="http://api.ning.com:80/files/zcN4*xGdgtQU6isBQjPUdCetKdfFhW7vBZ8sPUdEz-gNZCbNJZIBBSwwPq0B1B4rp7onQRG3WnwjDDCmHIcWppb*zr8uKb9x/TemplateMethodSolution.jpg" width="296"/></a></p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p>No código que segue abaixo é interessante observar que o padeiro e o confeiteiro não sabem como se faz um bolo eles apenas dizem eu quero o bolo de chocolate ou de morango e a classe Bolo fará todo o trabalho que já esta estruturado dentro da classe BoloBase que é herdada pela classe Bolo.</p>
<p> </p>
<p><span style="color: #0000ff;">using</span> <span style="color: #000000;">System;</span></p>
<p><span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span></p>
<p><span style="color: #000000;">{</span></p>
<p>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">EBolo</span></p>
<p>   <span style="color: #000000;">  {</span></p>
<p>          <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">enum</span> <span style="color: #008080;">TipoBolo</span> <span style="color: #000000;">{ Chocolate = 1, Morango = 2}</span></p>
<p>   <span style="color: #000000;">  }</span></p>
<p>} </p>
<p> </p>
<p><span style="color: #0000ff;">using</span> <span style="color: #000000;">System;</span></p>
<p><span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span></p>
<p>{</p>
<p>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">BoloBase</span></p>
<p>     {  </p>
<p>         <span style="color: #339966;">// template method</span></p>
<p>         <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">FazerBolo</span></p>
<p>         {</p>
<p>             <span style="color: #000000;">Passo1();</span></p>
<p><span style="color: #000000;">             Passo2();</span></p>
<p>         }</p>
<p>  <span style="color: #000000;">   }</span></p>
<p> </p>
<p>     <span style="color: #339966;">// esqueleto dos métodos</span></p>
<p>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">Passo1();</span></p>
<p>     <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">abstract</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">Passo2();</span></p>
<p>}</p>
<p> </p>
<p><span style="color: #0000ff;">using</span> <span style="color: #000000;">System;</span></p>
<p><span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span></p>
<p><span style="color: #000000;">{</span></p>
<p><span style="color: #0000ff;">      public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Bolo</span> : <span style="color: #008080;">BoloBase</span></p>
<p><span style="color: #000000;">      {</span></p>
<p><span style="color: #0000ff;">            private</span> <span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span> <span style="color: #000000;">tipoBolo;</span></p>
<p><span style="color: #0000ff;">            public</span> <span style="color: #000000;">Bolo(</span><span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span> <span style="color: #000000;">_tipoBolo)</span></p>
<p><span style="color: #000000;">            {</span></p>
<p><span style="color: #000000;">                 tipoBolo = _tipoBolo;</span></p>
<p><span style="color: #000000;">            }</span></p>
<p> </p>
<p><span style="color: #0000ff;">            public</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">Passo1()</span></p>
<p><span style="color: #000000;">            {</span></p>
<p><span style="color: #0000ff;">                 if</span>(<span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span>.<span style="color: #000000;">Chocolate == tipoBolo)</span></p>
<p>                 {</p>
<p><span style="color: #008080;">                      Console</span><span style="color: #000000;">.WriteLine("</span><span style="color: #ff0000;">Pega os ingredientes do bolo de chocolate</span><span style="color: #000000;">");</span></p>
<p>                 }</p>
<p><span style="color: #0000ff;">                 else</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(</span><span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span><span style="color: #000000;">.Morango == tipoBolo)</span></p>
<p><span style="color: #000000;">                 {</span></p>
<p><span style="color: #008080;">                      Console</span><span style="color: #000000;">.WriteLine(</span><span style="color: #ff0000;">"Pega os ingredientes do bolo de morango"</span><span style="color: #000000;">);</span></p>
<p><span style="color: #000000;">                 }</span></p>
<p>             }</p>
<p> </p>
<p><span style="color: #0000ff;">             public</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">Passo2()</span></p>
<p><span style="color: #000000;">             {</span></p>
<p><span style="color: #0000ff;">                  if</span><span style="color: #000000;">(</span><span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span><span style="color: #000000;">.Chocolate == tipoBolo)</span></p>
<p><span style="color: #000000;">                  {</span></p>
<p><span style="color: #008080;">                        Console</span>.<span style="color: #000000;">WriteLine</span>(<span style="color: #ff0000;">"Mistura os ingredientes de chocolate e leva ao forno"</span>);</p>
<p><span style="color: #000000;">                  }</span></p>
<p><span style="color: #0000ff;">                  else</span> <span style="color: #0000ff;">if</span><span style="color: #000000;">(EBolo.TipoBolo.Morango == tipoBolo)</span></p>
<p><span style="color: #000000;">                  {</span></p>
<p><span style="color: #008080;">                        Console</span><span style="color: #000000;">.</span><span style="color: #000000;">WriteLine</span><span style="color: #000000;">(</span><span style="color: #ff0000;">"Mistura os ingredientes de morango e leva ao forno"</span><span style="color: #000000;">);</span></p>
<p>                  }</p>
<p>             }</p>
<p>     }</p>
<p>}</p>
<p> </p>
<p><span style="color: #0000ff;">using</span> <span style="color: #000000;">System;</span></p>
<p><span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span></p>
<p><span style="color: #000000;">{</span></p>
<p><span style="color: #0000ff;">      public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Padeiro</span></p>
<p><span style="color: #000000;">      {</span></p>
<p><span style="color: #0000ff;">           public</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">FazerBolo(</span><span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span> <span style="color: #000000;">tipoBolo)</span></p>
<p><span style="color: #000000;">           {</span></p>
<p><span style="color: #008080;">                 Bolo</span> <span style="color: #000000;">bolo</span> = <span style="color: #0000ff;">new</span> <span style="color: #008080;">Bolo</span><span style="color: #000000;">(tipoBolo);</span></p>
<p><span style="color: #339966;">                 // chama o template method da classe BoloBase</span></p>
<p><span style="color: #000000;">                 bolo.FazerBolo();</span></p>
<p><span style="color: #000000;">           }</span></p>
<p><span style="color: #000000;">      }</span></p>
<p><span style="color: #000000;">}</span></p>
<p><span style="color: #000000;"> </span></p>
<p><span style="color: #0000ff;">using</span> <span style="color: #000000;">System;</span></p>
<p><span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span></p>
<p><span style="color: #000000;">{</span></p>
<p><span style="color: #0000ff;">       public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Confeiteiro</span></p>
<p><span style="color: #000000;">       {</span></p>
<p><span style="color: #0000ff;">             public</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">FazerBolo</span>(<span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span> <span style="color: #000000;">tipoBolo</span>)</p>
<p><span style="color: #000000;">             {</span></p>
<p><span style="color: #008080;">                   Bolo</span> <span style="color: #000000;">bolo =</span> <span style="color: #0000ff;">new</span> <span style="color: #008080;">Bolo</span><span style="color: #000000;">(tipoBolo);</span></p>
<p><span style="color: #339966;">                   // chama o template method da classe BoloBase</span></p>
<p><span style="color: #000000;">                   bolo.FazerBolo();</span></p>
<p><span style="color: #000000;">             }</span></p>
<p><span style="color: #000000;">       }</span></p>
<p><span style="color: #000000;">} </span></p>
<p> </p>
<p><span style="color: #0000ff;">using</span> <span style="color: #000000;">System;</span></p>
<p><span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span></p>
<p><span style="color: #000000;">{</span></p>
<p><span style="color: #0000ff;">       public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Program</span></p>
<p><span style="color: #000000;">       {</span></p>
<p><span style="color: #0000ff;">             static</span> <span style="color: #0000ff;">void</span> <span style="color: #000000;">Main</span>(<span style="color: #0000ff;">string</span><span style="color: #000000;">[] args)</span></p>
<p><span style="color: #000000;">             {</span></p>
<p><span style="color: #339966;">                  // instancia um objeto do tipo padeiro</span></p>
<p><span style="color: #008080;">                  Padeiro</span> <span style="color: #000000;">padeiro =</span> <span style="color: #0000ff;">new</span> <span style="color: #008080;">Padeiro</span><span style="color: #000000;">();</span></p>
<p><span style="color: #000000;">                  padeiro.FazerBolo(</span><span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span><span style="color: #000000;">.Chocolate);</span></p>
<p>  </p>
<p><span style="color: #339966;">                  // instancia um objeto do tipo confeiteiro</span></p>
<p><span style="color: #008080;">                  Confeiteiro </span><span style="color: #000000;">confeiteiro =</span> <span style="color: #0000ff;">new</span> <span style="color: #008080;">Confeiteiro</span><span style="color: #000000;">();</span></p>
<p><span style="color: #339966;"><span style="color: #008080;">                  confeiteiro</span>.<span style="color: #000000;">FazerBolo</span><span style="color: #000000;">(<span style="color: #008080;">EBolo</span>.<span style="color: #008080;">TipoBolo</span>.</span><span style="color: #000000;">Morango</span><span style="color: #000000;">);</span></span></p>
<p><span style="color: #000000;">             }</span></p>
<p><span style="color: #000000;">       }</span></p>
<p><span style="color: #000000;">} </span></p>
<p> </p>
<p><span style="color: #000000;">Nesse artigo, foi explicado como implementar um Template Method, e o quanto é importante definir a estrutura de um algoritmo numa única classe abstrata quando inúmeras classes podem precisar implementar esse algoritmo, basicamente a idéia do artigo consistiu em passar o conceito através de uma implementação simples, não envolvendo recursos complexos.</span></p>
<p> </p>
<p><strong>Para saber mais:</strong></p>
<p><span style="color: #000000;"><a href="http://devbrasil.net/group/cdesenvolvendores" target="_self">Aprofunde seu conhecimento sobre C#</a></span></p>
<p><span style="color: #000000;"><a href="http://www.dofactory.com/Patterns/PatternTemplate.aspx" target="_blank">GoFactory</a></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/cac875CAVKA" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;  &lt;/p&gt;
&lt;p&gt;O Template Method é um Padrão de Projeto muito utilizado, bem provável que você já o implementou talvez sem se quer saber, ou que você futuramente o implementará, esse padrão possui uma abstração simples de assimilação o que torna o mesmo mais popular a grande comunidade de desenvolvedores , diferente de outros padrões de nível complexo.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span class="font-size-4"&gt;&lt;strong&gt;&lt;span style="color: #008000;"&gt;Qual é a proposta do Template Method? …&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/MJkp5Juz*qCHvDTulMY6ApqItAG8ELSUysQEQYApx9wC20keeICv9O9D0glnmwbAYKSHEkuxfCn6swvhjMrTJv-fBBpFEQv5/template.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:169111</feedburner:origLink></item><item><title>Como localizar colunas pelo nome em tabelas do SQL Server</title><link>http://feedproxy.google.com/~r/devbrasil/~3/yU40Ne3oHcU/2307362:BlogPost:170710</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Carlos Mattos (MVP)</dc:creator><pubDate>Thu, 23 Feb 2012 04:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-02-23:2307362:BlogPost:170710</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>      Um cenário comum no ambiente de desenvolvimento de software é a necessidade do desenvolvedor de localizar tabelas do banco de dados <b>SQL Server</b> que contenham uma determinada coluna. Um script <b>T-SQL</b> muito simples pode ser utilizado para esta finalidade. Considere que você está buscando todas as tabelas que possuem a coluna “CustomerID” no banco de dados <b>AdventureWorks</b> no <b>SQL Server</b>. Observe o código apresentado na <b>Figura 1</b>.</p>
<p></p>
<p><img class="align-full" src="http://api.ning.com:80/files/8RGIGDSUYnCpvlBCKgBE2KWMyGnFv97cyjnylCqOY-lSC3wt5XMIPyEGiioacWpdZHOa5P**yDQLOop52MUNAv8tc*wUe*sd/tsql_find_column_by_name.PNG" width="700"/></p>
<p><b><br/></b></p>
<p><b>Figura 1: T-SQL Encontrar Coluna por Nome</b></p>
<p><b><br/></b></p>
<p>      O script acima retornará uma lista com os nomes de todas as tabelas do banco de dados AdventureWorks que contém uma coluna denominada “CustomerID”. Observe a <b>Figura 2</b>.</p>
<p></p>
<p><a href="http://api.ning.com:80/files/LNcVVBK4WiV-xftHXXo70anoXLqiQ8ujy8oSI3fgutL-GJjXzDJ4trL7pIOF83zUESfxvU3Dr7zss6AyhrBTnMT27PfbWNlr/Resultados_Find_Column_ByName.PNG" target="_self"><img class="align-full" src="http://api.ning.com:80/files/LNcVVBK4WiV-xftHXXo70anoXLqiQ8ujy8oSI3fgutL-GJjXzDJ4trL7pIOF83zUESfxvU3Dr7zss6AyhrBTnMT27PfbWNlr/Resultados_Find_Column_ByName.PNG" width="409" height="179"/></a></p>
<p><b><br/></b></p>
<p><b>Figura 2: Resultado do processamento do script da Figura 1</b></p>
<p> </p>
<p>      Existem formas diferentes para solucionar o problema proposto neste cenário. O exemplo acima, ilustra uma forma simples e prática. Você pode encapsular esse <em>scritp</em> numa <em>stored procedure</em> ou função para facilitar sua utilização pela equipe, até mesmo modificar o <em>script</em> para acrescentar informações relevantes para sua pesquisa.</p>
<p> </p>
<p><strong>Para saber mais:</strong></p>
<p><strong><a rel="nofollow" href="http://devbrasil.net/group/sqlserver" target="_self"><span>Aprofunde seus conhecimentos sobre este tema na comunidade sql server</span></a></strong></p>
<p></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/yU40Ne3oHcU" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;      Um cenário comum no ambiente de desenvolvimento de software é a necessidade do desenvolvedor de localizar tabelas do banco de dados &lt;b&gt;SQL Server&lt;/b&gt; que contenham uma determinada coluna. Um script &lt;b&gt;T-SQL&lt;/b&gt; muito simples pode ser utilizado para esta finalidade. Considere que você está buscando todas as tabelas que possuem a coluna “CustomerID” no banco de dados &lt;b&gt;AdventureWorks&lt;/b&gt; no &lt;b&gt;SQL Server&lt;/b&gt;. Observe o código apresentado na &lt;b&gt;Figura 1&lt;/b&gt;.…&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;img class="align-full" src="http://api.ning.com:80/files/8RGIGDSUYnCpvlBCKgBE2KWMyGnFv97cyjnylCqOY-lSC3wt5XMIPyEGiioacWpdZHOa5P**yDQLOop52MUNAv8tc*wUe*sd/tsql_find_column_by_name.PNG" width="700"&gt;&lt;/img&gt;&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:170710</feedburner:origLink></item><item><title>Realizando backup automático no SQL server express</title><link>http://feedproxy.google.com/~r/devbrasil/~3/geS5Gtxs4DI/2307362:BlogPost:167377</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Márcio Araújo</dc:creator><pubDate>Wed, 08 Feb 2012 18:00:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-02-09:2307362:BlogPost:167377</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>O Microsoft SQL Server Express é um produto de gerenciamento de dados poderoso e confiável que fornece recursos robustos, proteção de dados e desempenho para clientes de aplicativos incorporados, aplicativos Web simples e armazenamentos de dados locais. Criado para ser de protótipo rápido e de fácil implantação, o SQL Server Express está disponível gratuitamente e você pode redistribuí-lo com outros aplicativos.</p>
<p><br/>Com a versão do sql server express não temos como criar um backup automático pois a versão não dá suporte ao sql agent onde é responsável pelo processo.</p>
<p><br/> <span style="text-decoration: underline;"><strong>Então para criar uma forma automatizada vamos usar :</strong></span></p>
<p><br/> NomeDoArquivo.sql : guarda comando de backup do sql server.<br/> NomeDoArquivo.Bat : guarda usuário, senha( SQL server ) e caminho do arquivo .sql está salvo.</p>
<p><br/> <strong><span style="text-decoration: underline;">Agendador de tarefas do windows</span></strong></p>
<p><br/> Detalhando :<br/> Os arquivos são criados em blocos de notas.<br/> Dentro do NomeDoArquivo.Bat deverá conter o comando<br/> osql -U usuário -P senha -i c:\pasta\NomeDoArquivo.sql.SQL<br/> Dentro do NomeDoArquivo.sql deverá conter o comando<br/> Backup Database NomeBanco to disk="C:\pasta\backup.Bak"</p>
<p><br/> Agendador de tarefas do windows.</p>
<p>Caminho : Painel de Controle\Ferramentas Administrativas\Agendador de Tarefas.</p>
<p><br/> Exemplo :</p>
<p> </p>
<p><a href="http://api.ning.com:80/files/KKWU95gjbbqTGHr77Xhl3HDw1G3HOX9N6nvLdH*JVmYBKiWdF6zcnvorzcOKC3XDRYXOSksGjGS5SquaHPZxLxAyzg40jX0b/Tela2.png" target="_self"><img src="http://api.ning.com:80/files/KKWU95gjbbqTGHr77Xhl3HDw1G3HOX9N6nvLdH*JVmYBKiWdF6zcnvorzcOKC3XDRYXOSksGjGS5SquaHPZxLxAyzg40jX0b/Tela2.png" class="align-left" width="710"/></a><br/> Escolha a opção que seja feita o backup automático.</p>
<p> </p>
<p> </p>
<p><a href="http://api.ning.com:80/files/CyzvNsHIwJGtcQNC7y2dVK9U9t8uanXdinPKOPkS-zYSfvYHXTw5x5nutckZhqk9FCZ2OQU29HzyUo-cMsxIAKCeEvw2acCB/Tela3.png" target="_self"><img src="http://api.ning.com:80/files/CyzvNsHIwJGtcQNC7y2dVK9U9t8uanXdinPKOPkS-zYSfvYHXTw5x5nutckZhqk9FCZ2OQU29HzyUo-cMsxIAKCeEvw2acCB/Tela3.png" class="align-left" width="710"/></a><br/> Definir horário e data de início.</p>
<p><a href="http://api.ning.com:80/files/fjD2xZn8XGhRXRhBm0beG9R1qncUD80XVesMBxCtsGxQFEFsx9zEnOVX-shA812q2pjZ7Sb6lQRSY1bOMv2RIUXk02xM0AU*/Tela4.png" target="_self"><img src="http://api.ning.com:80/files/fjD2xZn8XGhRXRhBm0beG9R1qncUD80XVesMBxCtsGxQFEFsx9zEnOVX-shA812q2pjZ7Sb6lQRSY1bOMv2RIUXk02xM0AU*/Tela4.png" class="align-left" width="710"/></a></p>
<p>Escolher a opção "iniciar um programa".<br/> <a href="http://api.ning.com:80/files/Pc-jXkyBqx*LAaiQppavojJTZpjM2s0bmPiI8Rm4EnbEdhVvI36XUWrKPvTj62ETnZ6wM0Sfo-I282uFnszcBXIInJXXuRDE/Tela5.png" target="_self"><img src="http://api.ning.com:80/files/Pc-jXkyBqx*LAaiQppavojJTZpjM2s0bmPiI8Rm4EnbEdhVvI36XUWrKPvTj62ETnZ6wM0Sfo-I282uFnszcBXIInJXXuRDE/Tela5.png" class="align-full" width="710"/></a></p>
<p>Programar o script. Nesse caso será o arquivo .bat e concluir.<br/> <a href="http://img338.imageshack.us/img338/3014/tela6.png" target="_blank"><img src="http://img338.imageshack.us/img338/3014/tela6.png" class="align-left"/></a></p>
<p> </p>
<p>Com esses passos conseguimos definir um processo automatizado para criar backups agendados eliminando o uso manual do usuário. Lembrando que existe outras formas de<br/> criar este processo como por exemplo usando stored procedure.</p>
<p><br/> <strong>Para saber mais:</strong><br/> <span style="color: #003366;"><strong><a href="http://devbrasil.net/group/sqlserver" target="_self"><span style="color: #003366;">Aprofunde seus conhecimentos sobre este tema na comunidade sql server</span></a></strong></span><br/> <span style="color: #003366;"><strong><a href="http://www.microsoft.com/sqlserver/en/us/editions/express.aspx" target="_blank"><span style="color: #003366;">Download do sql server express</span></a></strong></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/geS5Gtxs4DI" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;O Microsoft SQL Server Express é um produto de gerenciamento de dados poderoso e confiável que fornece recursos robustos, proteção de dados e desempenho para clientes de aplicativos incorporados, aplicativos Web simples e armazenamentos de dados locais. Criado para ser de protótipo rápido e de fácil implantação, o SQL Server Express está disponível gratuitamente e você pode redistribuí-lo com outros aplicativos.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/br&gt;Com a versão do sql server express não temos como criar um backup…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/KKWU95gjbbqTGHr77Xhl3HDw1G3HOX9N6nvLdH*JVmYBKiWdF6zcnvorzcOKC3XDRYXOSksGjGS5SquaHPZxLxAyzg40jX0b/Tela2.png" length="0" type="image/png" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:167377</feedburner:origLink></item><item><title>C# 4.0 -  Dynamic Programming</title><link>http://feedproxy.google.com/~r/devbrasil/~3/wsd1G8UuuQY/2307362:BlogPost:166791</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Leandro Rodrigues</dc:creator><pubDate>Mon, 06 Feb 2012 08:33:39 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-02-06:2307362:BlogPost:166791</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p> </p>
<p><span style="color: #000000;">Segundo o prestigiado Engenheiro de Software dinamarquês Anders Hejlsberg responsável pela criação da linguagem C#, o "milestone", ou seja, o grande marco da versão C# 4.0 é o recurso Dynamic Programming, esse artigo tem por objetivo explicar sobre esse recurso que visa mudar o paradigma de desenvolvimento atual em alguns cenários.</span></p>
<p> </p>
<p><strong><span style="color: #008000;" class="font-size-4">Programação dinâmica </span></strong></p>
<p> </p>
<p><span style="color: #000000;">Linguagens como PHP, Perl, Python, Javascript e Ruby possuem portabilidade a programação dinâmica porque essas linguagens permitem que o desenvolvedor inclua um novo código ou altere métodos de objetos em tempo de execução e não em tempo de compilação.</span></p>
<p> </p>
<p><span style="color: #008000;" class="font-size-4"><strong>Dynamic Language Runtime</strong></span></p>
<p> </p>
<p><span style="color: #000000;">Anders Hejlsberg tinha como objetico fornecer a os desenvolvedores .NET uma maneira simples de programar de forma dinâmica dentro de uma linguagem tipada estaticamente, parece contraditório, porém foi possível atráves de uma nova camada incluída dentro do Framework 4.0.</span></p>
<p> </p>
<p><a href="http://api.ning.com:80/files/AIbdUkdGiSKETpFuVLDvoThgZHSkLjo4DRw3GEYvRnxhrWX3YV*weX1jxJNrHEEfB*jvDvGJsKSw8aCoWvURg7syBCJYOjZc/DLR.jpg" target="_self"><img src="http://api.ning.com:80/files/AIbdUkdGiSKETpFuVLDvoThgZHSkLjo4DRw3GEYvRnxhrWX3YV*weX1jxJNrHEEfB*jvDvGJsKSw8aCoWvURg7syBCJYOjZc/DLR.jpg" class="align-left" width="453"/></a> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p><span style="color: #000000;">O DLR fornece a disposição dos desenvolvedores o "Dynamic Type" que deve ser utilizado usando a palavra reservava dynamic, que nada mais é do que um tipo estático, o dynamic pode ser qualquer tipo a diferença dele para os demais tipos é que ele força o compilador a não fazer nenhuma validação em tempo de compilação, fazendo com que as operações sejam validadas apenas em tempo de execução.  </span></p>
<p> </p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Usabilidade</span></strong></span></p>
<p>  </p>
<p><span style="color: #000000;">Sintaxe básica de um Dynamic Type.</span></p>
<p> </p>
<p><span style="color: #0000ff;">dynamic</span> <span style="color: #000000;">var1</span> = <span style="color: #ff0000;">"1"</span><span style="color: #000000;">;</span><br/> <span style="color: #0000ff;">dynamic</span> <span style="color: #000000;">var2 = 2;</span><br/> <span style="color: #0000ff;">dynamic</span> <span style="color: #000000;">var3</span> = <span style="color: #0000ff;">new</span> <span style="color: #000000;">{ DevBrasil =</span> <span style="color: #ff0000;">"Submmit 2012"</span><span style="color: #000000;">};</span></p>
<p><span style="color: #0000ff;"> </span></p>
<p><span style="color: #000000;">Acima foi colocado alguns tipos de objetos que o dynamic aceita, lembrando que ele aceita qualquer tipo, e que podemos passar esses tipos por parâmetro ou como tipo de retorno de um método.</span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;">Antes do c# 4.0 sem Dynamic Programming<br/></span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;"><span style="color: #0000ff;">using</span> System;<br/> <br/> <span style="color: #0000ff;">namespace</span> DevBrasil<br/> {<br/>     <span style="color: #0000ff;">public class</span> <span style="color: #008080;">Program</span><br/>     {<br/>         <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>         {<br/>             SelecionarNomeMembro(<span style="color: #0000ff;">new</span> { NomeMembro = <span style="color: #ff0000;">"Leandro Rodrigues"</span> });<br/>         }<br/> <br/>         <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> SelecionarNomeMembro&lt;T&gt;(T t)<br/>         {<br/>             <span style="color: #0000ff;">string</span> nome = <span style="color: #0000ff;">typeof</span>(T).GetProperty(<span style="color: #ff0000;">"NomeMembro"</span>).GetValue(t, <span style="color: #0000ff;">null</span>) <span style="color: #0000ff;">as</span> <span style="color: #0000ff;">string</span>;<br/> <br/>             <span style="color: #008080;">Console</span>.WriteLine(<span style="color: #000000;">nome</span>);<br/>             <span style="color: #0000ff;"><span style="color: #008080;">Console</span></span>.ReadLine();<br/>         }<br/>     }<br/> }</span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;"><span style="color: #000000;">Depois do c# 4.0 com Dynamic Programming</span></span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;"><span style="color: #000000;"><span style="color: #0000ff;">using</span> System;<br/> <br/> <span style="color: #0000ff;">namespace</span> DevBrasil<br/> {<br/>     <span style="color: #0000ff;">public class</span> <span style="color: #008080;">Program</span><br/>     {<br/>         <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>         {<br/>             SelecionarNomeMembro(<span style="color: #0000ff;">new</span> { NomeMembro = <span style="color: #ff0000;">"Leandro Rodrigues"</span> });<br/>         }<br/> <br/>         <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> SelecionarNomeMembro(<span style="color: #0000ff;">dynamic</span> obj)<br/>         {<br/>             <span style="color: #008080;">Console</span>.WriteLine(<span style="color: #000000;"><span style="color: #000000;">obj</span></span>.NomeMembro);<br/>             <span style="color: #008080;">Console</span>.ReadLine();<br/>         }<br/>     }<br/> }</span></span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;">Com esses dois exemplos de código acima ficou fácil mensurar o ganho, antes era muito mais complexo, precisava ser empregado Reflection, de forma simples economizamos uma linha e deixamos o código muito fácil de ser entendido! =D.<br/></span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;">Abaixo segue outro exemplo onde é extremamente vantajoso o uso do tipo dinâmico.</span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;"><span style="color: #339966;">// Antes do c# 4.0 sem Dynamic Programming</span><br/> <span style="color: #0000ff;">var</span> xmlDoc = <span style="color: #0000ff;">new</span> XmlDocument(<span style="color: #ff0000;">"arquivo.xml"</span>);<br/> <span style="color: #0000ff;">var</span> xmlElement = xmlDoc.GetElement(<span style="color: #ff0000;">"membro"</span>).GetElement(<span style="color: #ff0000;">"nome"</span>);<br/> <br/> <span style="color: #339966;">// Depois do c# 4.0 com Dynamic Programming</span><br/> <span style="color: #0000ff;">dynamic</span> xmlDoc = <span style="color: #0000ff;">new</span> XmlDocument(<span style="color: #ff0000;">"arquivo.xml"</span>);<br/> <span style="color: #0000ff;">var</span> xmlElement = xmlDoc.membro.nome;</span></p>
<p><span style="color: #000000;"> </span></p>
<p><span style="color: #000000;">Outro nível de utilização e também muito importante é a portabilidade a componentes COM, bem como, a linguagens dinâmicas como IronRuby, porém deixaremos isso para um próximo artigo ;) ...</span><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Vantagens</span></strong></span></p>
<p> </p>
<p><span style="color: #000000;">- Permite uma maior flexibilidade</span></p>
<p><span style="color: #000000;">- Melhora a utilização de objetos de componentes COM</span></p>
<p><span style="color: #000000;">- Portabilidade total a linguagens como IronPython e IronRuby</span></p>
<p><span style="color: #000000;">- Diminiu a complexidade existentes na manipulação de tipos anônimos.</span></p>
<p> </p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Desvantagens</span></strong></span></p>
<p> </p>
<p><span style="color: #000000;">- Forte tendencia a gerar BUG.</span></p>
<p> </p>
<p><span class="font-size-4"><strong><span style="color: #008000;">Remediando a desvantagem</span></strong></span>  </p>
<p> </p>
<p><span style="color: #000000;">O recurso dynamic type na minha concepção é muito interessante, no entando em alguns cenários temos alguns problemas,como tudo é resolvido apenas em tempo de execução, em tempo de compilação nada é verificado, ou seja, em tempo de execução uma variável do tipo inteiro pode ter atribuida para um tipo DateTime o que irar gerar bug.</span></p>
<p></p>
<p><span style="color: #000000;">O remédio para esses erros não existirem é a utilização de teste unitário, então todo desenvolvedor que for trabalhar com dynamic type dentro de um cenário complexo, deve saber que é de extrema necessidade realizar o teste unitário.</span></p>
<p><span style="color: #000000;"> </span></p>
<p><span style="color: #000000;">Nesse artigo, foi explicado a importancia da utilização do Dynamic Programming através do dynamic type, o objetivo foi mostrar em quais cenários podemos utilizar esse recurso, bem como, popularizar a utilização desse recurso na comunidade de desenvolvedores .NET.</span></p>
<p><strong> </strong></p>
<p><span style="color: #000000;"><strong>Para saber mais:</strong></span></p>
<p><strong><a href="http://devbrasil.net/group/cdesenvolvendores" target="_self">Aprofunde seu conhecimento sobre C#</a></strong>  </p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/dd264736.aspx" target="_blank">MSDN Dynamic Type</a></strong></p>
<p><strong> </strong></p>
<p><strong><br/></strong></p>
<p> </p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/wsd1G8UuuQY" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="color: #000000;"&gt;Segundo o prestigiado Engenheiro de Software dinamarquês Anders Hejlsberg responsável pela criação da linguagem C#, o "milestone", ou seja, o grande marco da versão C# 4.0 é o recurso Dynamic Programming, esse artigo tem por objetivo explicar sobre esse recurso que visa mudar o paradigma de desenvolvimento atual em alguns cenários.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="font-size-4" style="color: #008000;"&gt;Programação…&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/AIbdUkdGiSKETpFuVLDvoThgZHSkLjo4DRw3GEYvRnxhrWX3YV*weX1jxJNrHEEfB*jvDvGJsKSw8aCoWvURg7syBCJYOjZc/DLR.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:166791</feedburner:origLink></item><item><title>C# 4.0 - Named e Optional Arguments</title><link>http://feedproxy.google.com/~r/devbrasil/~3/Njr0gnRAtS8/2307362:BlogPost:165753</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Leandro Rodrigues</dc:creator><pubDate>Fri, 27 Jan 2012 09:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-01-27:2307362:BlogPost:165753</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Uma das novidades do Framework 4.0 são os Named e Optional Arguments. Esse novo recurso introduzido no c# 4.0 permite uma maior independencia e flexibilidade na construção de métodos que recebem parâmetros, tornando a vida do desenvolvedor mais tranquila. </p>
<p> </p>
<p><span class="font-size-4"><span style="color: #339966;"><strong>Optional Arguments</strong></span> </span></p>
<p> </p>
<p>Optional Arguments é um recurso que permite ao desenvolvedor escrever um método definindo parâmetros com um valor padrão , dessa forma não existe a obrigatoriedade de especificar esse parâmetro na chamada desse método, porque internamente o CLR(Common Language Runtime) identifica esse valor padrão.</p>
<p> </p>
<p>O código que segue a baixo ilustra como tinhamos que chamar um método nas versões anteriores, ou seja, não existia outra alternativa a não ser passar todos os parâmetros. </p>
<p> </p>
<p><span style="color: #0000ff;">using</span> System;<br/> <br/> <span style="color: #0000ff;">namespace</span> <span style="color: #000000;">DevBrasil</span><br/> {<br/> <span style="color: #0000ff;">    public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Program</span><br/>     {<br/> <span style="color: #0000ff;">        static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>         {<br/> <span style="color: #339966;">           // chamada do método</span><br/> <span style="color: #339966;">           // é necessário informar os 3 parâmetros</span><br/> <span style="color: #008080;">          DevBrasil</span>.SelecionarProduto(1, 10, 15);<br/>         }<br/>     }<br/> <br/> <span style="color: #0000ff;">    public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">DevBrasil</span><br/>     {<br/> <span style="color: #0000ff;">       public</span> DevBrasil() { }<br/> <span style="color: #0000ff;">       public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> SelecionarProduto(<span style="color: #0000ff;">int</span> codProduto, <span style="color: #0000ff;">int</span> codCategoria, <span style="color: #0000ff;">int</span> qtdProduto)<br/>        {<br/> <span style="color: #339966;">          // conteúdo do método</span><br/>        }   <br/>      }<br/> } </p>
<p> </p>
<p>Para os parâmetros serem opcionais basta apenas utilizar o operador <strong>=</strong> (igual) mais o valor padrão.</p>
<p>Dessa forma quando o método é chamado não precisa informar os dois últimos parâmetros caso não ocorra necessidade. </p>
<p> </p>
<p><span style="color: #0000ff;">using</span> System;<br/> <br/> <span style="color: #0000ff;">namespace</span> DevBrasil<br/> {<br/> <span style="color: #0000ff;">     public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Program</span><br/>      {<br/> <span style="color: #0000ff;">        static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>         {<br/> <span style="color: #339966;">           // chamada do método</span><br/> <span style="color: #339966;">           // é passado apenas o primeiro parâmetro os outros dois são opcionais</span><br/> <span style="color: #339966;">           // porque codCategoria por</span> <span style="color: #339966;">padrão</span> <span style="color: #339966;">é 10 e qtdProduto é 20</span><br/> <span style="color: #008080;">          DevBrasil</span>.SelecionarProduto(1);<br/>         }<br/>      }<br/> <br/> <span style="color: #0000ff;">    public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">DevBrasil</span><br/>     {<br/> <span style="color: #0000ff;">       public</span> DevBrasil() { }<br/> <span style="color: #0000ff;">       public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> SelecionarProduto(<span style="color: #0000ff;">int</span> codProduto, <span style="color: #0000ff;">int</span> codCategoria = 10, <span style="color: #0000ff;">int</span> qtdProduto = 20)<br/>        {<br/> <span style="color: #339966;">         // conteúdo do método</span><br/>        }  <br/>     }<br/> } </p>
<p> </p>
<p>Antes do c# 4.0 sem Optional Arguments</p>
<p> </p>
<p><span style="color: #339966;">// Salvar um objeto Workbook </span><br/> Workbooks.SaveAs(@<span style="color: #ff0000;">"C:\DevBrasil.xlsx"</span>, <br/> <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>,<br/> <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>,<br/> <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>,<br/> <span style="color: #0000ff;">Type.Missing</span>, <span style="color: #0000ff;">Type.Missing</span>); </p>
<p> </p>
<p>Depois do c# 4.0 com Optional Arguments</p>
<p> </p>
<p>Workbooks.SaveAs(@<span style="color: #ff0000;">"C:\DevBrasil.xlsx"</span>);  </p>
<p> </p>
<p>Tivemos melhoras ;)  Lembrando que tudo isso o Framework faz para a gente por de trás dos panos! =D</p>
<p> </p>
<p><span class="font-size-4" style="color: #339966;"><strong>Named Arguments</strong></span></p>
<p><strong> </strong></p>
<p>Named Arguments é uma alternativa para que o parâmetro possa ser informado em qualquer ordem na chamada do método, no exemplo anterior tinhamos que informar os parâmetros na mesma ordem que eles foram atribuídos no corpo do método, o Named Arguments resolve isso para nós! </p>
<p>  </p>
<p>Segue a sintaxe utilizada para passar um argumento nomeado.  </p>
<p> </p>
<p><span style="color: #0000ff;">using</span> System;<br/> <br/> <span style="color: #0000ff;">namespace</span> DevBrasil<br/> {<br/> <span style="color: #0000ff;">     public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Program</span><br/>      {<br/> <span style="color: #0000ff;">        static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>         {<br/> <span style="color: #339966;">           // chamada do método</span><br/> <span style="color: #339966;">           // são passados todos parâmetros utilizando named optional</span><br/> <span style="color: #008080;">           DevBrasil</span>.SelecionarProduto(codProduto:1,codCategoria:40,qtdProduto:50);<br/>         }<br/>      }<br/> <br/> <span style="color: #0000ff;">     public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">DevBrasil</span><br/>      {<br/> <span style="color: #0000ff;">        public</span> DevBrasil() { }<br/> <span style="color: #0000ff;">        public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> SelecionarProduto(<span style="color: #0000ff;">int</span> codProduto, <span style="color: #0000ff;">int</span> codCategoria = 10, <span style="color: #0000ff;">int</span> qtdProduto = 20)<br/>         {<br/> <span style="color: #339966;">           // conteúdo do método</span><br/>         } <br/>      }<br/> }</p>
<p> </p>
<p>Agora que acontece a mágica! Como internamente o CLR irá procurar pelo nome, não importará mais a posição que o parâmetro seja passado!!! =D</p>
<p> </p>
<p>A chamada do método é realizada passando os parâmetros da forma inversa que eles foram declarados no corpo do método!</p>
<p></p>
<p><span style="color: #0000ff;">using</span> System;<br/> <br/> <span style="color: #0000ff;">namespace</span> DevBrasil<br/> {<br/> <span style="color: #0000ff;">    public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Program</span><br/>     {<br/> <span style="color: #0000ff;">       static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>        {<br/> <span style="color: #339966;">          // chamada do método</span><br/> <span style="color: #339966;">          // são passados todos parâmetros de forma invertida utilizando named optional</span><br/> <span style="color: #008080;">          DevBrasil</span>.SelecionarProduto(qtdProduto: 50, codCategoria: 40, codProduto: 1);<br/>        }<br/>     }<br/> <br/> <span style="color: #0000ff;">    public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">DevBrasil</span><br/>     {<br/> <span style="color: #0000ff;">       public</span> DevBrasil() { }<br/> <span style="color: #0000ff;">       public</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> SelecionarProduto(<span style="color: #0000ff;">int</span> codProduto, <span style="color: #0000ff;">int</span> codCategoria = 10, <span style="color: #0000ff;">int</span> qtdProduto = 20)<br/>        {<br/> <span style="color: #339966;">           // conteúdo do método</span><br/>        } <br/>     }<br/> }</p>
<p>  </p>
<p>Outra dica é que o Named e Optional Arguments também pode ser utilizados em métodos construtores.</p>
<p></p>
<p><strong> </strong></p>
<p><strong>Para saber mais:</strong></p>
<p><strong><a href="http://devbrasil.net/group/cdesenvolvendores" target="_self">Aprofunde seu conhecimento sobre C#</a></strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/dd264739.aspx" target="_blank">Artigo sobre Named e Optional Arguments MSDN</a> </strong></p>
<p><strong><a href="http://weblogs.asp.net/scottgu/archive/2010/04/02/optional-parameters-and-named-arguments-in-c-4-and-a-cool-scenario-w-asp-net-mvc-2.aspx" target="_self">Caso de Uso de Named e Optional Arguments</a></strong></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/Njr0gnRAtS8" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Uma das novidades do Framework 4.0 são os Named e Optional Arguments. Esse novo recurso introduzido no c# 4.0 permite uma maior independencia e flexibilidade na construção de métodos que recebem parâmetros, tornando a vida do desenvolvedor mais tranquila. &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span class="font-size-4"&gt;&lt;span style="color: #339966;"&gt;&lt;strong&gt;Optional Arguments&lt;/strong&gt;&lt;/span&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Optional Arguments é um recurso que permite ao desenvolvedor escrever um método definindo parâmetros…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:165753</feedburner:origLink></item><item><title>Padrões de Projeto: Adapter</title><link>http://feedproxy.google.com/~r/devbrasil/~3/GGS1O6Dl8S8/2307362:BlogPost:162863</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Leandro Rodrigues</dc:creator><pubDate>Fri, 20 Jan 2012 13:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-01-20:2307362:BlogPost:162863</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><span style="font-family: verdana, geneva;">O Padrão Adapter visa facilitar a conversão da interface de uma classe para outra interface que seja mais importante para o cliente, fazendo com que várias classes possam trabalham em conjunto independente das interfaces originais.</span><strong style="font-family: verdana, geneva;"> </strong></p>
<p><span style="font-family: verdana,geneva;"><strong> </strong></span></p>
<p><span style="font-family: 'verdana', 'geneva'; color: #339966;" class="font-size-4"><strong>Desenho e Reuso</strong></span></p>
<p><span style="font-family: verdana,geneva;"> </span></p>
<p><span style="font-family: verdana,geneva;">Desenhar software Orientado a Objeto não é uma tarefa fácil, desenhar um software Orientado a Objeto que seja reusável é uma tarefa muito mais difícil.</span></p>
<p> </p>
<p><span class="font-size-4" style="color: #339966;"><strong>Algumas das tarefas são:</strong></span></p>
<p> </p>
<p>- Identificar as abstrações corretas.</p>
<p>- Definir classes na granularidade apropriada.</p>
<p>- Estabelecer interfaces, hierarquias e relacionamento.</p>
<p> </p>
<p>Ou seja, deve-se pensar em tudo isso de forma a evitar o re-desenho, pois precisamos que o software seja flexível, desenhistas experiêntes conseguem criar bons desenhos OO, os que não tem experiência quase sempre entram numa modelagem estruturada.</p>
<p> </p>
<p><span style="color: #339966;" class="font-size-4"><strong>Quais são as diferenças?</strong></span></p>
<p> </p>
<p>- Desenhistas experiêntes não tentam resolver todos os problemas usando "receita de bolo" eles procuram reusar soluções que funcionaram bem no passado, são capazes de identificar "padrões" recorrentes nos problemas enfrentados e nas soluções encontradas.</p>
<p> </p>
<p><span style="color: #339966;" class="font-size-4"><strong>Definição de Padrão:</strong></span></p>
<p> </p>
<p>" Um padrao é uma solução recorrente para um problema em um determinado contexto " Erich Gamma</p>
<p>" Cada padrão descreve um problema que acontece repetidas vezes no nossos ambiente e então descreve a essência da solução para aquele problema, de forma que você possa usar essa solução um milhão de vezes, mas nunca fazendo duas vezes a mesma coisa " Chistofher Alexander</p>
<p> </p>
<p><strong><span style="color: #339966;" class="font-size-4">Padrão Adapter</span> </strong><a target="_self" href="http://api.ning.com:80/files/hdCbgaF2pHl3IuhLj2eGG6SD7DlVOh0fOn5GwESWxKahk*m4VITaqMjLswosBCAl7I8N4NdnMd9VmAeXs3KaXXFryiNV5xKO/adapter.jpg"><img class="align-right" src="http://api.ning.com:80/files/hdCbgaF2pHl3IuhLj2eGG6SD7DlVOh0fOn5GwESWxKahk*m4VITaqMjLswosBCAl7I8N4NdnMd9VmAeXs3KaXXFryiNV5xKO/adapter.jpg" width="115"/></a>  <a target="_self" href="http://api.ning.com:80/files/7csaX1I5auUJRC*S8TYHWxOfdTvJnVH19*pE1fhm-s7BuBtjieCtdvgviesyxTyNmxbsDVWU4EiqO9JQQCavgV4dUeyK0iuh/adaptavel.jpg"></a><a target="_self" href="http://api.ning.com:80/files/7csaX1I5auUJRC*S8TYHWxOfdTvJnVH19*pE1fhm-s7BuBtjieCtdvgviesyxTyNmxbsDVWU4EiqO9JQQCavgV4dUeyK0iuh/adaptavel.jpg"></a></p>
<p><span style="color: #333333;"> </span></p>
<p><span style="color: #333333;">Ser adaptável é ser capaz de mudar para se enquadrar em outro contexto, como o camaleão que muda de cor se camuflando no ambiente para confundir seu predador, no entanto, em OO a palavra mudança não é verdadeira porque esse padrão respeita um dos príncípios gerais de OO "o código deve estar fechado para modificação e aberto para extensão"<strong>.</strong></span></p>
<p> </p>
<p><span style="color: #333333;">Dessa forma quero dizer que o padrão adapter só deve ser usado se você não poder modificar sua(s) classe(s).</span></p>
<p><span style="color: #000000; font-family: verdana,geneva;"><br/></span></p>
<p><span style="color: #333333; font-family: verdana,geneva;">As vezes, precisamos utilizar métodos de uma classe existente para trabalhar com uma biblioteca também já existente, o desenho ideal para trabalhar dentro desse cenário é criar uma outra classe chamada Adapter que herdará de uma classe existente enquanto ao mesmo tempo implementará uma interface de uma biblioteca existente. O resultado final é que o Adapter pode chamar o método de uma classe existente através da herança, bem como, pode trabalhar com a existente biblioteca, desde que implemente a interface dessa biblioteca.</span></p>
<p><span style="color: #000000;"><br/></span></p>
<p><span style="color: #000000;">Segue UML do Padrão Adapter</span></p>
<p><span style="color: #000000;"> </span></p>
<p><span style="color: #000000;"><a target="_self" href="http://api.ning.com:80/files/qaz1Qa5Bm48OD72j*HvzVgXEYzLiPSHaY0EXhD5CKHS8VnHMIrXdYcPZjhx9wM6evAwyQTatLiTAVTbzVF5sE0DKKTGkoMxF/ModelUML.jpg"><img class="align-left" src="http://api.ning.com:80/files/qaz1Qa5Bm48OD72j*HvzVgXEYzLiPSHaY0EXhD5CKHS8VnHMIrXdYcPZjhx9wM6evAwyQTatLiTAVTbzVF5sE0DKKTGkoMxF/ModelUML.jpg" width="561"/></a></span></p>
<p> </p>
<p><span style="color: #3366ff;"><br/></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #333333;">- O Adaptee é uma classe existente</span></p>
<p><span style="color: #333333;">- A IInterface é um interface definida numa existente biblioteca</span></p>
<p><span style="color: #333333;">- O Adapter é a classe que você cria, é herdade da classe Adaptee e implementa a interface IInterface.</span></p>
<p><span style="color: #333333;">  Importante notar que você pode invocar o método OperationA da classe Adaptee utilizando o método OperationB da classe Adapter, por isso é muito comum pessoas dizerem que a classe Adapter tem o objetivo de converte uma interface.<br/></span></p>
<p><span style="color: #333333;"><strong><br/></strong></span></p>
<p><span style="color: #333333;">Utilizaremos agora um exemplo no mundo real.</span></p>
<p><span style="color: #333333;">Vamos imaginar que temos uma classe chamada Aluno e toda classe Aluno acessa o método de um Adapter que implementa a interface IEstudante de uma biblioteca já existente.</span></p>
<p><span style="color: #333333;"><br/></span></p>
<p><span style="color: #333333;">Aluno precisa estar plugado dentro de um Adapter. O Aluno class é o Adaptee.</span></p>
<p><span style="color: #333333;"><br/></span></p>
<p><span style="color: #333333;">A forma de fazer isso é criar um Adapter<strong> </strong>class chamada AlunoAdapter, que herdada classe Aluno<strong>, </strong>enquanto que ao mesmo tempo implementa a interface IEstudante.</span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><a target="_self" href="http://api.ning.com:80/files/vFx5srRnetNfNAX3v3LhJKEd9RaUa3FR83XgsyLUhAOsPHayQx9rYNiEOAWFrjZQvip23016tc0sSP8mLSIH0hFWafmB3GcE/ModelEstudar.jpg"><img class="align-left" src="http://api.ning.com:80/files/vFx5srRnetNfNAX3v3LhJKEd9RaUa3FR83XgsyLUhAOsPHayQx9rYNiEOAWFrjZQvip23016tc0sSP8mLSIH0hFWafmB3GcE/ModelEstudar.jpg" width="301"/></a><br/></span></span></p>
<p><strong><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></strong></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #3366ff;"><span style="color: #000000;"><br/></span></span></p>
<p><span style="color: #333333;"> </span></p>
<p><span style="color: #333333;">No adapter nos podemos chamar um método, o método Estudar da classe parente Aluno, então na classe AlunoAdapter nós podemos chamar o método Estudar através da implementação da interface IEstudante que a classe AlunoAdapter faz por meio do método Ler.</span></p>
<p><span style="color: #333333;"><br/></span></p>
<p><span style="color: #333333;">Agora vamos ver como isso funciona programaticamente, para isso teremos que pegar um avião e fazer uma breve viagem a objetolandia ;)<br/></span></p>
<p><span style="color: #333333;"> </span></p>
<p><span style="color: #333333;">Importante notar que não precisamos mudar nenhum código da classe Aluno.</span></p>
<p><span style="color: #333333;"> </span></p>
<p><span style="color: #333333;"><span style="color: #0000ff;">using</span> System;<br/> <span style="color: #0000ff;">using</span> System.Collections.Generic;<br/> <br/> <span style="color: #0000ff;">namespace</span> DevBrasil<br/> {<br/>      <span style="color: #0000ff;">class</span> <span style="color: #008080;">Program</span><br/>      {<br/>          <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Main(<span style="color: #0000ff;">string</span>[] args)<br/>          {</span></p>
<p><span style="color: #333333;">            <span style="color: #333333;"><span style="color: #333333;"><span style="color: #008080;">List</span> <span style="color: #888888;">&lt;IEstudante&gt;</span></span></span> <span style="color: #333333;"> listaEstudante = <span style="color: #0000ff;">new</span> <span style="color: #008080;">List</span> <span style="color: #888888;">&lt;IEstudante&gt;();</span></span><br/>             listaEstudante.Add(<span style="color: #0000ff;">new</span> <span style="color: #008080;">Estudante</span>(<span style="color: #ff0000;">"Pedro José"</span>));<br/>             listaEstudante.Add(<span style="color: #0000ff;">new</span> <span style="color: #008080;">Estudante</span>(<span style="color: #ff0000;">"Juca Cipó"</span>));<br/>             listaEstudante.Add(<span style="color: #0000ff;">new</span> <span style="color: #008080;">AlunoAdapter</span>(<span style="color: #ff0000;">"Ana Maria"</span>)); <span style="color: #339966;">//Aluno de classe já existente</span><br/>             Ler(listaEstudante);<br/>             Console.Read();<br/>          }<br/> <br/> <span style="color: #339966;">         // O código abaixo é de uma biblioteca existente e não precisa ser mudado</span><br/>          <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">void</span> Ler(<span style="color: #333333;"><span style="color: #333333;"><span style="color: #008080;">List</span> <span style="color: #888888;">&lt;IEstudante&gt;</span></span></span> listaEstudante)<br/>          {<br/>              <span style="color: #0000ff;">foreach</span> (<span style="color: #008080;">IEstudante</span> estudante <span style="color: #0000ff;">in</span> listaEstudante)<br/>              {<br/>                 estudante.Ler();<br/>              }<br/>          }<br/>      }</span></p>
<p><span style="color: #333333;"> </span></p>
<p><span style="color: #333333;"><span style="color: #339966;">     // O código abaixo é de uma biblioteca existente e não precisa ser mudado</span><br/>      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">interface</span> <span style="color: #008080;">IEstudante</span><br/>      {<br/>         <span style="color: #0000ff;">void</span> Ler();<br/>      }<br/> <br/>      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Estudante</span> : <span style="color: #008080;">IEstudante</span><br/>      {<br/>          <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">string</span> nome;<br/>          <span style="color: #0000ff;">public</span> Estudante(<span style="color: #0000ff;">string</span> nome)<br/>          {<br/>             <span style="color: #0000ff;">this</span>.nome = nome;<br/>          }<br/> <br/>         <span style="color: #0000ff;">void</span> <span style="color: #008080;">IEstudante</span>.Ler()<br/>         {<br/>            <span style="color: #008080;">Console</span>.WriteLine(<span style="color: #ff0000;">"Estudante "</span> + <span style="color: #0000ff;">this</span>.nome + <span style="color: #ff0000;">" precisa ler"</span>);<br/>         }<br/>      }</span></p>
<p><span style="color: #333333;"> </span></p>
<p><span style="color: #333333;"><span style="color: #339966;">     // O código abaixo é de uma biblioteca existente e não precisa ser mudado</span><br/>      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">Aluno</span><br/>      {<br/>          <span style="color: #0000ff;">private</span> <span style="color: #0000ff;">string</span> nome;<br/>          <span style="color: #0000ff;">public</span> Aluno(<span style="color: #0000ff;">string</span> nome)<br/>          {<br/>              <span style="color: #0000ff;">this</span>.nome = nome;<br/>          }<br/> <br/>          <span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">void</span> Estudar()<br/>          {<br/>              <span style="color: #008080;">Console</span>.WriteLine(<span style="color: #ff0000;">"Aluno"</span> + <span style="color: #0000ff;">this</span>.nome + <span style="color: #ff0000;">" precisa estudar."</span>);<br/>          }<br/>      }<br/> <br/>      <span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> <span style="color: #008080;">AlunoAdapter</span> : <span style="color: #008080;">Aluno</span>, <span style="color: #008080;">IEstudante</span><br/>      {<br/>          <span style="color: #0000ff;">public</span> AlunoAdapter(<span style="color: #0000ff;">string</span> nome) : <span style="color: #0000ff;">base</span>(nome) { }<br/>          <span style="color: #0000ff;">void</span> <span style="color: #008080;">IEstudante</span>.Ler()<br/>          {<br/>              <span style="color: #0000ff;">base</span>.Estudar(); <span style="color: #339966;">// chama o construtor da classe Aluno</span><br/>          }<br/>      } </span></p>
<p><span style="color: #333333;">} </span></p>
<p><strong> </strong></p>
<p><span style="color: #339966;" class="font-size-4"><strong>Quando aplicar :</strong></span></p>
<p> </p>
<p>- Deseja-se usar uma classe existente, mas a sua interface não bate com aquela esperada.</p>
<p>- Quer-se criar uma classe reusável que coopera com classes não-relacionadas e não-previstas, que podem não ser compatíveis.</p>
<p> </p>
<p>Nesse artigo a gente pode notar a importância do Padrão Adapter dentro de um cenário no qual não podemos mudar nossas classes e sim apenas extendê-las, bem como, avaliamos o quanto é importante uma modelagem coesa, experimentada e aprovada, o que garante a qualidade do código e a facilidade para dar manutenção ao mesmo.  </p>
<p> </p>
<p><strong>Para saber mais:</strong></p>
<p><strong><a href="http://devbrasil.net/group/cdesenvolvendores" target="_self">Aprofunde seu conhecimento sobre C#</a> </strong></p>
<p><strong><a href="http://www.theserverside.com/patterns" target="_blank">Forum discussão sobre padrões</a> </strong></p>
<p><strong><a href="http://www.amazon.com/Design-Patterns-Elements-Reusable-Object-Oriented/dp/0201633612" target="_blank">Livro : GAMMA, Erich; HELM, Richard; JHONSON, Ralph; VLISSIDES; Jhon. Designer Patterns: Elemens of Reusable Object-Oriented Software. USA: Addilson-Wesley Professional Computing Series. 1995</a></strong></p>
<p><strong><a href="http://www.amazon.com/First-Design-Patterns-Elisabeth-Freeman/dp/0596007124" target="_blank">Livro: FREEMAN, Eric; FREEMAN, Elisabeth. Head First Designer Patterns. USA O'Really, 2004</a></strong></p>
<p><strong><a href="http://www.amazon.com/Patterns-Enterprise-Application-Architecture-Martin/dp/0321127420" target="_blank">Livro: FOWLER, Martin, Patterns of Enterprise Application Architecture. USA: Hardcover, 2002</a></strong></p>
<p></p>
<p></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/GGS1O6Dl8S8" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;span style="font-family: verdana, geneva;"&gt;O Padrão Adapter visa facilitar a conversão da interface de uma classe para outra interface que seja mais importante para o cliente, fazendo com que várias classes possam trabalham em conjunto independente das interfaces originais.&lt;/span&gt;&lt;strong style="font-family: verdana, geneva;"&gt; &lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: verdana,geneva;"&gt;&lt;strong&gt; …&lt;/strong&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/hdCbgaF2pHl3IuhLj2eGG6SD7DlVOh0fOn5GwESWxKahk*m4VITaqMjLswosBCAl7I8N4NdnMd9VmAeXs3KaXXFryiNV5xKO/adapter.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:162863</feedburner:origLink></item><item><title>Introdução ao Entity Framework Code First Migrations</title><link>http://feedproxy.google.com/~r/devbrasil/~3/8NHFVlrYsDc/2307362:BlogPost:159813</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Leandro Carvalho Guimarães</dc:creator><pubDate>Thu, 05 Jan 2012 12:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2012-01-05:2307362:BlogPost:159813</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Para quem já conhece o EF (Entity Framework) com a utilização do <i>Code First</i> (Código primeiro) sabe como era incomodo ter que recriar o banco toda vez que realizasse uma nova alteração no modelo, isso a título de desenvolvimento. Com o pacote <i><span style="color: #000000;">EntityFramework.Migrations</span> disponibilizado no EF 4.2</i> é possível melhorar este cenário permitindo o desenvolvedor ter um controle maior do modelo do banco de dados, no qual permitirá até criar versões dos modelos gerados pelo EF.</span></p>
<p style="text-align: left;"><span class="font-size-2" style="font-family: verdana,geneva;">Normalmente se utilizava classes de inicialização que recriavam o modelo do banco. Algo como:</span></p>
<blockquote><p style="text-align: left;"><span class="font-size-2" style="color: #000000; font-family: verdana,geneva;">context.Database.CreateIfNotExists();</span></p>
</blockquote>
<p style="text-align: left;"><br/> <span class="font-size-2" style="font-family: verdana,geneva;">Com isso o banco era recriado toda vez que encontrasse uma alteração no modelo de código ao comparar com os dados que são informados na tabela <i>EdmMetadata</i> que também era necessário. Na imagem abaixo é possível ver a tabela que é criada automaticamente pelo framework para seu controle.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p style="text-align: center;"><span class="font-size-2" style="color: #ff0000; font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/F1B6YD*p0HuINrKT61oEqiJboSKxTArOrGfPqzlIqHW63pp7fxN9pspKmnO7a7paLH17rACTTBBYG6iXcKvbBqO7xrytWua7/edmmetadata.jpg"><img class="align-center" src="http://api.ning.com:80/files/F1B6YD*p0HuINrKT61oEqiJboSKxTArOrGfPqzlIqHW63pp7fxN9pspKmnO7a7paLH17rACTTBBYG6iXcKvbBqO7xrytWua7/edmmetadata.jpg" width="269"/></a></span></p>
<p style="text-align: center;"><span class="font-size-2" style="color: #ff0000; font-family: verdana,geneva;"><br/></span></p>
<p style="text-align: center;"><span class="font-size-2" style="color: #ff0000; font-family: verdana,geneva;"><br/></span></p>
<p><span class="font-size-2" style="color: #000000; font-family: verdana,geneva;"><b>EntityFramework.Migrations</b></span></p>
<p><span class="font-size-2" style="color: #000000; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">No EF 4.2 não necessitamos criar uma classe de inicialização ou ficar recriando o banco de dados, apenas iremos gerar versões de nosso modelo e atualizar o banco para a versão desejada inclusive mantendo os dados existentes.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Para utilização da migração é necessário possuir obviamente o pacote <i>EntityFramework</i> e também do pacote <i><span style="color: #000000;">EntityFramework.Migrations</span>.</i> Se você não possui os pacotes adicionados em seu projeto, acompanhe os seguintes passos da instalação através do NuGet que é uma extensão do Visual Studio e possui um console com diversas funcionalidades, dentre elas, baixar pacotes diretamente para seu projeto de maneira muito simples.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><br/></span></p>
<p style="text-align: left;"><span class="font-size-2" style="font-family: verdana,geneva;">Com o NuGet instalado vá em:</span> <span class="font-size-2" style="color: #000000; font-family: verdana,geneva;">Tools –&gt; Library Package Manager –&gt; Package Manager Console</span></p>
<p style="text-align: left;"><span class="font-size-2" style="color: #ff0000; font-family: verdana,geneva;"><br/></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><a target="_self" href="http://api.ning.com:80/files/Q3UJ3uD0kKdaew6A4M9jhY4k5roZ39dpj2ARyx71iWnRFuvH1sTOSENReWtqNDQia9iCQCDyx4dNKqRYK24REA3Vh2bSrqrD/nuget.jpg"><img class="align-center" src="http://api.ning.com:80/files/Q3UJ3uD0kKdaew6A4M9jhY4k5roZ39dpj2ARyx71iWnRFuvH1sTOSENReWtqNDQia9iCQCDyx4dNKqRYK24REA3Vh2bSrqrD/nuget.jpg" height="165" width="553"/></a></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Você verá esta tela que é o console do Nuget. Para nosso exemplo, crie um projeto qualquer, irei demonstrar com um simples projeto <i>Class Library de nome “DevBrasil”</i>como mostrado abaixo, duas classes ainda sem relacionamento e o nosso contexto que não será explicado neste artigo, pois não é nosso objetivo e espera-se que o leitor conheça um pouco de EF.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/qMahXYSU*YJhUZcvGxJJqyvMi8qNT3*gJi00HSW8EcMNB0ioOQnQEuQZOr7KdlQxeJ5yOwBSR2Qo3og0EcALQ0hLPgfymwit/solution1.jpg"><img class="align-center" src="http://api.ning.com:80/files/qMahXYSU*YJhUZcvGxJJqyvMi8qNT3*gJi00HSW8EcMNB0ioOQnQEuQZOr7KdlQxeJ5yOwBSR2Qo3og0EcALQ0hLPgfymwit/solution1.jpg" width="324"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/OnMp08dM21aJ0eHpmWumRHkyLrZ3yXNaKIlGlSAWf0Zx0QqJXbhG6fwU5PxSfhFRC6MY*7vaxKDUM8W2IrgryVexEtKwKRXx/classePessoa1.jpg"><img class="align-center" src="http://api.ning.com:80/files/OnMp08dM21aJ0eHpmWumRHkyLrZ3yXNaKIlGlSAWf0Zx0QqJXbhG6fwU5PxSfhFRC6MY*7vaxKDUM8W2IrgryVexEtKwKRXx/classePessoa1.jpg" width="324"/></a><a target="_self" href="http://api.ning.com:80/files/yMk3pcbL5JNEj7dADPIRj**-IOOXYbtOeTDVQaUaL7d70cOMgqa5X71Gg37m-8slBVeDMkQQCuU-w49lIkK3lDfbN2uIHrEF/classeOpcao1.jpg"><img class="align-center" src="http://api.ning.com:80/files/yMk3pcbL5JNEj7dADPIRj**-IOOXYbtOeTDVQaUaL7d70cOMgqa5X71Gg37m-8slBVeDMkQQCuU-w49lIkK3lDfbN2uIHrEF/classeOpcao1.jpg" width="324"/></a><a target="_self" href="http://api.ning.com:80/files/nH4PAoE8r7mOL5tgVLNSGExxih8RYvAoonqb6NTap*NFIUA-jFOD2FgQuvVR0isJLE3s0tZeRFD2HX*2fCRa*6xT8FR-eaEE/contexto.jpg"><img class="align-center" src="http://api.ning.com:80/files/nH4PAoE8r7mOL5tgVLNSGExxih8RYvAoonqb6NTap*NFIUA-jFOD2FgQuvVR0isJLE3s0tZeRFD2HX*2fCRa*6xT8FR-eaEE/contexto.jpg" width="550"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Explicando apenas o “<span style="color: #000000;">modelBuilder.Conventions.Remove&lt;IncludeMetadataConvention&gt;();</span>” esta linha é adicionada para remover a necessidade da tabela <i>EdmMetadata</i> como mostrada no início e assim termos uma maior independência do controle do framework.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><br/></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><span class="font-size-2" style="font-family: verdana,geneva;"><strong>Importando os Pacotes Necessários</strong></span> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Agora vamos adicionar os pacotes do <i>EntityFramework</i> e <i>EntityFramework.Migrations</i> ao nosso projeto.</span></p>
<p> </p>
<p>Abra o console do NuGet e verifique primeiramente se o Default Project é o que você está utilizando e no console digite:</p>
<blockquote><p style="text-align: left;"><span class="font-size-2" style="font-family: verdana,geneva;"><span style="color: #ff0000;"><span style="color: #000000;">“</span><span style="color: #000000;">Install-Package EntityFramework</span></span>” e digite enter.</span></p>
<p style="text-align: center;"><span class="font-size-2" style="font-family: verdana,geneva;"><br/></span></p>
</blockquote>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Você verá o processo de instalação e logo depois de obter a mensagem de confirmação:</span></p>
<blockquote><p><span class="font-size-2" style="font-family: verdana,geneva; color: #000000;">“Successfully installed 'EntityFramework 4.2.0.0” e</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva; color: #000000;">“Successfully added 'EntityFramework 4.2.0.0' to DevBrasil”</span></p>
</blockquote>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Você pode conferir na pasta de referências se foi devidamente baixado conforme a figura a seguir.</span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><a target="_self" href="http://api.ning.com:80/files/or711FD69C8UkhTy*B8TBm1r77vllRo76TbN2IVYG1wlDREYlDy*e2jMYJE2FSpnhC1f-n42mz9tOTSps7Vlu52yn0I9jpZ*/solution2.jpg"><img class="align-center" src="http://api.ning.com:80/files/or711FD69C8UkhTy*B8TBm1r77vllRo76TbN2IVYG1wlDREYlDy*e2jMYJE2FSpnhC1f-n42mz9tOTSps7Vlu52yn0I9jpZ*/solution2.jpg" width="323"/></a></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><br/></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Realize o mesmo processo para a instalação do pacote EntityFramework.Migrations pois ele ainda não está disponível dentro do pacote <i>EntityFramework</i> o que deverá acontecer futuramente assim como o EntityFramework também fazer parte do .Net Framework. Ao instalar o pacote no projeto é criada uma pasta chamada “Migrations” contendo um arquivo “Configuration.cs” como podemos ver na imagem abaixo da nossa solução.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><br/></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/dB2pkI1dpeqfOjUMbxTXXtBUhqjDP9YbM7q-5JTE4iBJSQClUY9kN4VLujrKVGWoQ2n-XAWeE8Zt7f69ZWAz53SAMgBc6LuK/solution3.jpg"><img class="align-center" src="http://api.ning.com:80/files/dB2pkI1dpeqfOjUMbxTXXtBUhqjDP9YbM7q-5JTE4iBJSQClUY9kN4VLujrKVGWoQ2n-XAWeE8Zt7f69ZWAz53SAMgBc6LuK/solution3.jpg" width="323"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/cSucb7o7yaoJH5Z3kCLc9MiHIgJyt2CU1zcJSHkXbf29hRkI*skwI1GLqZWppGo69zxHTUvbeus7aPch-PMnVNENcKqOjndQ/configuration1.jpg"><img class="align-center" src="http://api.ning.com:80/files/cSucb7o7yaoJH5Z3kCLc9MiHIgJyt2CU1zcJSHkXbf29hRkI*skwI1GLqZWppGo69zxHTUvbeus7aPch-PMnVNENcKqOjndQ/configuration1.jpg?width=750" width="750"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Na imagem acima podemos ver a estrutura do arquivo “Configuration.cs”, por enquanto iremos apenas adicionar o contexto onde é indicado na primeira marcação e no construtor setamos uma propriedade “AutomaticMigrationEnabled” como false para mantermos mais controle ainda em nossas migrações sendo necessário gerar para cada modificação uma versão diferente. E removerei o comentário da segunda marcação para ficar mais limpa a classe. A imagem a seguir ilustra como ficará.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/eZM4X*cx*ObEKhjblFlyvjNoRLGBqeDR*qnTQjIUuG1L*GfOyoRgW*eSBWWgmai*iQTNleDME-tplLjeDVKG2Jdn4xA7sD5G/configuration2.jpg"><img class="align-center" src="http://api.ning.com:80/files/eZM4X*cx*ObEKhjblFlyvjNoRLGBqeDR*qnTQjIUuG1L*GfOyoRgW*eSBWWgmai*iQTNleDME-tplLjeDVKG2Jdn4xA7sD5G/configuration2.jpg" width="559"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Agora vamos criar nossa primeira versão do Contexto (modelo) criado. Abra o console do NuGet e digite:</span></p>
<blockquote><p><span class="font-size-2" style="font-family: verdana,geneva;"><span style="color: #000000;">“Add-Migration PrimeiraVersao”</span> e digite enter.</span></p>
</blockquote>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Será criada uma classe com o nome “PrimeiraVersao” com algumas informações relevantes no inicio. Essa classe contém dois métodos: Up e Down.</span></p>
<ul>
<li><span class="font-size-2" style="font-family: verdana,geneva;">Up: Método chamado quando é feita o Up-grade do banco ao solicitar a migração da versão.</span></li>
<li><span class="font-size-2" style="font-family: verdana,geneva;">Down: Método chamado quando a classe é chamada como Down-grade caso já exista uma versão gerada posteriormente em uso.</span></li>
</ul>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><a target="_self" href="http://api.ning.com:80/files/nH4PAoE8r7mzUP7dr06Y-sxb21fHytr2Ef1ZNtiZfN5fDphABBzvpoxrz*zGgUWRzCSzdsiN2wdlUYVYP28DwyozsUUej7S*/solution4.jpg"><img class="align-center" src="http://api.ning.com:80/files/nH4PAoE8r7mzUP7dr06Y-sxb21fHytr2Ef1ZNtiZfN5fDphABBzvpoxrz*zGgUWRzCSzdsiN2wdlUYVYP28DwyozsUUej7S*/solution4.jpg" width="322"/></a></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><a target="_self" href="http://api.ning.com:80/files/XQ4WbXwBSfqAu8rR9QV5b57sUNR4sYtygj8-1vfqipL4YFIY0Ie4eACGdKa3ObL1Obg3maNr0za7EaLkYroINFvzK74qJl3Z/primeiraversao.jpg"><img class="align-center" src="http://api.ning.com:80/files/XQ4WbXwBSfqAu8rR9QV5b57sUNR4sYtygj8-1vfqipL4YFIY0Ie4eACGdKa3ObL1Obg3maNr0za7EaLkYroINFvzK74qJl3Z/primeiraversao.jpg" width="494"/></a></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Com a nossa primeira versão gerada só nos resta atualizar o banco, como não foi setado nenhum banco padrão no contexto, o Visual Studio fará com que seja criando no banco local, caso exista é claro. Para atualizar devemos abrir o Console do NuGet e digitar:</span></p>
<blockquote><p><span class="font-size-2" style="font-family: verdana,geneva;"><span style="color: #000000;">“Update-Database -TargetMigration:"PrimeiraVersao" –Verbose”</span> e digitar enter.</span></p>
</blockquote>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Não é necessário digitar todo esse comando para se realizar uma atualização, na verdade só é necessário o “Update-Database” o “-TargetMigration” serve para nos garantir para qual versão estamos migrando, inclusive é com ele que realizamos down-grade, basta informar o nome da versão desejada. E “-Verbose” serve para exibir todo SQL que é executado dentro do próprio console do NuGet, então acho uma boa prática utilizar a atualização desta maneira.</span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"> </span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><a target="_self" href="http://api.ning.com:80/files/dR5Oc1cgrRP6fFpK6WDjCcGf87aowBQVvjSHj4PQKof2AaNZsEzcY3XPxZa-QjxCWissd67A81Z-NhmE*av51UUCKZYWX9D6/sqlnuget.jpg"><img class="align-center" src="http://api.ning.com:80/files/dR5Oc1cgrRP6fFpK6WDjCcGf87aowBQVvjSHj4PQKof2AaNZsEzcY3XPxZa-QjxCWissd67A81Z-NhmE*av51UUCKZYWX9D6/sqlnuget.jpg" width="674"/></a><br/></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Na imagem a seguir podemos ver o banco que foi gerado. A tabela foi gerada com nome “Opcaos” pela pluralização do <i>Entity Framework</i>que pode ser contornado quando as classes forem bem configuradas, o que não é nosso caso aqui.</span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><a target="_self" href="http://api.ning.com:80/files/MxjusPtMUvwWurGRqqOEzUkVsURh1PL148NeBv6UgoP9p71hFfI2Yi38wekErrgLTewAEUCXMzRGWZpatR-mT0eOLISq8bRg/banco1.jpg"><img class="align-center" src="http://api.ning.com:80/files/MxjusPtMUvwWurGRqqOEzUkVsURh1PL148NeBv6UgoP9p71hFfI2Yi38wekErrgLTewAEUCXMzRGWZpatR-mT0eOLISq8bRg/banco1.jpg" width="256"/></a></b></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Para testar uma atualização adicione na classe “Pessoa.cs” a propriedade:</span></p>
<blockquote><p style="text-align: left;"><span class="font-size-2" style="color: #000000; font-family: verdana,geneva;">public List&lt;Opcao&gt; Opcoes { get; set; }</span></p>
</blockquote>
<p><br/> <span class="font-size-2" style="font-family: verdana,geneva;">E gere uma nova versão chamada “SegundaVersao” através do console do NuGet como já demonstrado antes, e depois atualize o banco informando a “SegundaVersao”. Ao conferir o banco você verá que foi adicionada a chave estrangeira a tabela "opcaos" sem deletar o banco, apenas realizando as modificações necessárias.</span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;">Neste artigo pudemos aprender como fazer migrações/atualizações no banco de dados de maneira rápida, simples e 100% ao controle do desenvolvedor quando se utiliza o Entity Framework Code First, a partir deste exemplo você será capaz de partir para outros estudos.</span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><b><br/></b></span></p>
<p><span class="font-size-2" style="font-family: verdana,geneva;"><b><strong>Para saber mais:</strong></b></span></p>
<p><span style="color: #003366;"><strong><span class="font-size-2" style="font-family: verdana, geneva;"><a rel="nofollow" href="http://devbrasil.net/group/adonet"><span style="color: #003366;">Aprofunde seus conhecimentos sobre ADO.NET</span></a></span></strong></span></p>
<p><span style="color: #003366;"><strong><span class="font-size-2" style="font-family: verdana, geneva;"><a rel="nofollow" href="http://blogs.msdn.com/b/adonet/" target="_blank"><span style="color: #003366;">Blog ADO.NET</span></a></span></strong></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva; color: #003366;"><strong><a href="http://thedatafarm.com/blog/" target="_blank"><span style="color: #003366;">Blog da Julie Lerman's</span></a></strong></span></p>
<p><span class="font-size-2" style="color: #33cccc; font-family: verdana,geneva;"><span style="color: #003366;"><strong><a href="http://nuget.org/" target="_blank"><span style="color: #003366;">Download do Nuget</span></a></strong></span><br/></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/8NHFVlrYsDc" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;span class="font-size-2" style="font-family: verdana,geneva;"&gt; &lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class="font-size-2" style="font-family: verdana,geneva;"&gt;Para quem já conhece o EF (Entity Framework) com a utilização do &lt;i&gt;Code First&lt;/i&gt; (Código primeiro) sabe como era incomodo ter que recriar o banco toda vez que realizasse uma nova alteração no modelo, isso a título de desenvolvimento. Com o pacote &lt;i&gt;&lt;span style="color: #000000;"&gt;EntityFramework.Migrations&lt;/span&gt; disponibilizado no EF 4.2&lt;/i&gt; é…&lt;/span&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/F1B6YD*p0HuINrKT61oEqiJboSKxTArOrGfPqzlIqHW63pp7fxN9pspKmnO7a7paLH17rACTTBBYG6iXcKvbBqO7xrytWua7/edmmetadata.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:159813</feedburner:origLink></item><item><title>Autenticação e Permissões de usuários em ASP.NET MVC 4</title><link>http://feedproxy.google.com/~r/devbrasil/~3/sZQshsrTvKs/2307362:BlogPost:158798</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Renan Cunha</dc:creator><pubDate>Thu, 29 Dec 2011 17:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-30:2307362:BlogPost:158798</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2">Neste artigo iremos ver uma maneira eficiente de autenticar usuários e definir permissões para os mesmos, ou seja, quais locais de uma aplicação (em ASP.NET MVC 4) o usuário poderá acessar. A autenticação e as permissões serão feitas a partir de informações contida em um banco de dados. Para desenvolver o exemplo do artigo estarei utilizando o Visual Web Developer 2010 (Visual Studio 2010), um banco de dados (SQL Server 2008) e o Entity Framework 4.1.</span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><strong><span style="color: #ff0000;" class="font-size-2"><span style="font-family: verdana, geneva;"><span style="color: #000000;">Importante</span></span></span></strong></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2">Porém o foco do artigo não será ensinar o básico do MVC e nem a integração da aplicação com o banco de dados. O foco será totalmente voltado para a questão da autenticação. É interessante que o leitor já tenha um conhecimento prévio sobre o framework ASP.NET MVC para que não fique perdido.</span></p>
<p><span class="font-size-2"><font face="verdana, geneva"><br/></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;">Eu irei disponibilizar o download de uma aplicação básica, e nós iremos implementar nela um controle de login e depois definir os locais que um dado usuário poderá acessar.</span><span style="font-family: verdana, geneva;">A estrutura dessa aplicação que iremos tomar como ponto de partida é a seguinte:</span></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;"><br/></span></span></p>
<p><span class="font-size-2"><em><span style="color: #000000;"><span style="font-family: verdana, geneva;">(O download da aplicação que usaremos está no final do artigo)</span></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;"><a href="http://api.ning.com:80/files/RfjjONm41dSmKiMhsgh2GpxElo9WiTRFLFpjEB9h6M7XU1mjU47cmPNFf8SSIXEBNHV1Ibx2BsfbaXDkAyO8hO787w8n8B9x/tutorial_1.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/RfjjONm41dSmKiMhsgh2GpxElo9WiTRFLFpjEB9h6M7XU1mjU47cmPNFf8SSIXEBNHV1Ibx2BsfbaXDkAyO8hO787w8n8B9x/tutorial_1.png" width="736" class="align-full"/></span></a></span></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;">Imagem 1 - Estrutura básica da aplicação</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva"><i><br/></i> Bom, primeiro é importante entendermos a lógica utilizada para modelar o banco de dados utilizado.</font></span></p>
<p><span style="color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/JcUR7uhLt3BUt9QkjgjJrT3cicvDeobMOGDM5-xinPUU4xjSJ7YrYlFqKbJQGFOF1bHDIY8ogJNq5mdxs63anY-VHiomJPSf/tutorial_2.png" target="_self"><span style="color: #000000;"><font face="verdana, geneva"><img src="http://api.ning.com:80/files/JcUR7uhLt3BUt9QkjgjJrT3cicvDeobMOGDM5-xinPUU4xjSJ7YrYlFqKbJQGFOF1bHDIY8ogJNq5mdxs63anY-VHiomJPSf/tutorial_2.png" width="402" class="align-full"/></font></span></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;">Imagem 2 - Estrutura do banco de dados</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em> <span style="font-family: verdana, geneva;">Podemos ver que a relação entre Usuários e Permissões é uma relação de muitos para muitos, pois um usuário pode ter várias permissões, e uma permissão pode pertencer a vários usuários. O Entity Framework já mapeou essa relação entre as entidades, como pode ser visto ali, o Usuario possui uma lista de Permissoes e vice-versa.</span></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="color: #000000;" class="font-size-2"><strong><span style="font-family: verdana, geneva;"><span style="color: #000000;">Autenticação</span></span></strong></span></p>
<p><span class="font-size-2" style="color: #000000;"><span style="font-family: verdana, geneva;"><font size="2">Para iniciarmos, crie um novo diretório no nosso projeto, chamado Repositories. É nele que iremos guardar os repositórios da aplicação, que nada mais são do que classes que irão manipular a parte de dados da aplicação. Criado o diretório, crie dentro dele uma classe chamada UsuarioRepositorio, que será o repositório de Usuários, é nele que iremos implementar funcionalidades, como o método que irá tentar autenticar uma pessoa entre outros. (Que fique claro aqui que essa maneira como estou criando os diretórios, trabalhar com repositório, é uma opinião pessoal, cada um desenvolve da maneira que achar mais organizada, se você preferir organizar a estrutura de outra maneira não tem problema algum. Feito os passos acimas deveremos ter algo como a imagem abaixo:</font></span></span></p>
<p><span class="font-size-2" style="color: #000000;"><span style="font-family: verdana, geneva;"><a href="http://api.ning.com:80/files/ubaGfb2dTZGGl49Iwj1Pq-Va*DHgSHcWONz58QM9WaI8dnfGTYNGxAWpuoSSUNcvDXwxHFdASGuexFsh*5ohfvsHp-MV-WYO/tutorial_3.png" target="_self"><span style="color: #000000;"><font size="2"><img src="http://api.ning.com:80/files/ubaGfb2dTZGGl49Iwj1Pq-Va*DHgSHcWONz58QM9WaI8dnfGTYNGxAWpuoSSUNcvDXwxHFdASGuexFsh*5ohfvsHp-MV-WYO/tutorial_3.png" width="309" class="align-full"/></font></span></a></span></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><font size="2">Imagem 3 - Novo repositório</font></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><font size="2"><br/></font></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><font size="2"><br/></font></span></em> <span style="font-family: verdana, geneva;"><font size="2">Agora abra a nova classe criada "<strong>UsuarioRepositorio</strong>", e vamos implementar alguns métodos e propriedades nela. Primeiramente iremos criar um método estático chamado A</font></span><span style="font-family: verdana, geneva;"><font size="2">utenticarUsuario que receberá como parâmetro duas strings, uma é o Login e a outra é a Senha. O resultado final será esse:</font></span></span></p>
<p><span class="font-size-2" style="color: #000000;"><span style="font-family: verdana, geneva;"><a href="http://api.ning.com:80/files/CUasw1sp8rzhhUc5ph-qumFeSXV*IVf1Fr3Cgk0JbnEAT0gxL-7rzPmNjuG87pZc6lBWWpBDCBltCydnTzAxQiPwOh675rbe/tutorial_4.png" target="_self"><font size="2"><span style="color: #000000;"><img src="http://api.ning.com:80/files/CUasw1sp8rzhhUc5ph-qumFeSXV*IVf1Fr3Cgk0JbnEAT0gxL-7rzPmNjuG87pZc6lBWWpBDCBltCydnTzAxQiPwOh675rbe/tutorial_4.png" width="532" class="align-full"/></span></font></a></span></span></p>
<p></p>
<p></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;">Imagem 4 - Código para autenticar o usuário</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em> <span style="font-family: verdana, geneva;">O código acima se auto-explica facilmente. Primeiro nós verificamos se os dados informados realmente existem no banco de dados e se pertencem, caso se obtenha sucesso, é setado o cookie de autenticação. O próximo passo agora é criamos um método estático que irá retornar o Usuario que está logado, caso existir um usuário logado é claro. O código final desse outro método será o seguinte:</span></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/CUasw1sp8rwF1Ci1*HuZiekqfKUSzJpv76so08yEpW9GxY7sOjH8uJCrsz-OEzWI4lC6Hg6czUeIb1KFM0FFEF6gNz1t6SC-/tutorial_5.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/CUasw1sp8rwF1Ci1*HuZiekqfKUSzJpv76so08yEpW9GxY7sOjH8uJCrsz-OEzWI4lC6Hg6czUeIb1KFM0FFEF6gNz1t6SC-/tutorial_5.png" width="499" class="align-full"/></span></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;">Imagem 5 - Código para buscar o usuário logado</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em> <span style="font-family: verdana, geneva;">O código acima também é simples, ele apenas verifica se existe algum usuário logado (existência do cookie encriptado), caso exista ele faz uma busca no banco de dados e retorna um objeto Usuario.</span></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;"><br/></span></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;">Vamos implementar também no repositório Usuário, um método que irá desfazer a autenticação, ou seja, vai "Deslogar". Ele é bem simples:</span></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;"><a href="http://api.ning.com:80/files/tvsUwTptxJAuWGkk89UM6kLGfscB0ZxDLHNB5vwrX8BvR9pRxMEcU410i40OQRd0kQUF358bDx6DTsdb40nutgGGg7xyabAN/tutorial_15.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/tvsUwTptxJAuWGkk89UM6kLGfscB0ZxDLHNB5vwrX8BvR9pRxMEcU410i40OQRd0kQUF358bDx6DTsdb40nutgGGg7xyabAN/tutorial_15.png" width="319" class="align-full"/></span></a></span></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2">A próxima etapa agora é implementar a autenticação na hora que usuário tentar logar. Se você verificar, no controlador "<em>UsuarioController</em>" já existe o ambiente preparado para exibir a página de login, e também para tratar o processamento lógico, que é quando o usuário envia o formulário preenchido. Na aplicação que estamos usando como base, já está criado o View para o usuário fazer o login. A URL dessa página de login é por convenção "<em>/Usuarios/Logar</em>", pois o nome do <em>controller </em>é Usuarios e o do método é Logar.</span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2">Abra a classe "<em>UsuarioController</em>", que se encontra no namespace Controllers da aplicação. Vá até o método "<em>public ActionResult Logar(UsuarioLogin_M model)</em>". É aqui que iremos <em>disparar</em> aquele método estático "<em>AutenticaUsuario</em>" que criamos lá no repositório do Usuario. Observe como ficará o código:</span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/EDZ8LD1MpQo27JfbtKjXcpKIj3HdId-kNDgf28izkQHXgesNt2PTj-FPWw1JE7cImtTLxeRYTZhiC50wUmo3CpFsaSEP0FUd/tutorial_6.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/EDZ8LD1MpQo27JfbtKjXcpKIj3HdId-kNDgf28izkQHXgesNt2PTj-FPWw1JE7cImtTLxeRYTZhiC50wUmo3CpFsaSEP0FUd/tutorial_6.png" width="709" class="align-full"/></span></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;">Imagem 6 - Código disparado quando o usuário tenta logar</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva"><i><br/></i></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;">Se você executou todas etapas corretamente, rode a aplicação e vamos testar, para ver se o login está funcionando corretamente.</span> <span style="font-family: verdana, geneva;">Já existe um usuário de testes cadastrado, os dados para logar nele é teste/teste. Se você conseguiu efetuar o login e chegou na página abaixo, significa que a parte da autenticação está completa.</span></span></p>
<p><span style="color: #000000;" class="font-size-2"><span style="font-family: verdana, geneva;"><a href="http://api.ning.com:80/files/-9HC8cdXIxfvK8xUfH3k1Ad-KYsBKN1xIuZyvoB7oN-OgGq6BOAFzDQiY*7MSn6J*YewG9NUX3gc5kQEhbcfMR5EjnpQdDMJ/tutorial_7.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/-9HC8cdXIxfvK8xUfH3k1Ad-KYsBKN1xIuZyvoB7oN-OgGq6BOAFzDQiY*7MSn6J*YewG9NUX3gc5kQEhbcfMR5EjnpQdDMJ/tutorial_7.png" width="475" class="align-full"/></span></a></span></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;">Imagem 7 - Resultado da autenticação</span></em></span></p>
<p><span class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span class="font-size-2"><em><span style="font-family: verdana, geneva;"><br/></span></em> <strong><span style="color: #000000;"><span style="font-family: verdana, geneva;">Permissões</span></span></strong></span></p>
<p><span style="color: #000000;" class="font-size-2"><font size="2">Bem, com a autenticação funcionando, vamos partir para as permissões. Se você reparar no controller "<em>UsuarioController</em>", no método que retorna o View da página que somente usuários logados podem acessar, existe uma anotação "<em>[Authorize]</em>" nele.</font></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/tvsUwTptxJCcRd87HqUvDfV5O4PhY7-QPDg8z-F5c1jf5tshs6anKY2W9GY9GaK4yMVuq5waP4E1BsW4V*B9GvQ8s3Ib4Eig/tutorial_8.png" target="_self"><font size="2"><span style="color: #000000;"><img src="http://api.ning.com:80/files/tvsUwTptxJCcRd87HqUvDfV5O4PhY7-QPDg8z-F5c1jf5tshs6anKY2W9GY9GaK4yMVuq5waP4E1BsW4V*B9GvQ8s3Ib4Eig/tutorial_8.png" width="726" class="align-full"/></span></font></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><font size="2">Imagem 8 - Anotação Authorize</font></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><font size="2"><br/></font></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-family: verdana, geneva;"><font size="2"><br/></font></span></em> <span style="font-family: verdana, geneva;"><font size="2">A anotação </font></span><span style="font-family: verdana, geneva;"><font size="2"><em><strong>Authorize</strong></em> é um recurso do modo que estamos utilizando para autenticar nossos usuários (<em>FormsAuthentication</em>). Todo método que tiver essa anotação, quando requisitado, passará por uma verificação para ver se existe um usuário logado ou não.</font></span></span></p>
<p><span style="font-family: verdana, geneva; color: #000000;" class="font-size-2"><font size="2"><br/></font></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2">O problema é o seguinte, e se nós possuirmos dois tipos de usuários, por exemplo, os usuários comuns e um outro tipo, que seria os administradores. É obvio que os administradores teriam acessos a outras áreas do site. Conforme falado lá no inicio, o nosso banco de dados foi estruturado para funcionar desta maneira, com vários tipos de usuários.</span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2">A seguir iremos fazer algumas implementações para que a anotação <em>Authorize</em> receba as permissões por parâmetros. Quando o Authorize é executado, ele busca as "Roles" que seriam no nosso caso, as permissões disponíveis para o usuário. O que acontece é que como estamos fazendo isso de uma maneira alternativa, armazenando as permissões em nosso DB, precisamos sobrescrever o método que lista as "Roles" de um certo usuário.</span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2">Para iniciar, nós iremos criar um outro diretório em nossa aplicação, chamado "<em>Security</em>". Dentro desse diretório, crie uma nova classe em branco chamada "<em>PermissaoProvider</em>" e estenda essa classe a classe "<em>RoleProvider</em>" que faz parte do namespace "<em>System.Web.Security</em>". O próximo passo é selecionarmos a opção para que o Visual Studio implemente para nós todos métodos da classe abstrata "<em>RoleProvider</em>" como mostra a imagem abaixo:</span></p>
<p><span style="font-size: small; font-family: verdana, geneva;" class="font-size-2"><a href="http://api.ning.com:80/files/JcUR7uhLt3CAA8JzM4PRzx2sMThxSc0uX7ZvEJaL*hlTLlNZu0Il6cigPaDbvB9P6m*q50guB7B08jridx*MGJtwhbH3UhMx/tutorial_9.png" target="_self"><img src="http://api.ning.com:80/files/JcUR7uhLt3CAA8JzM4PRzx2sMThxSc0uX7ZvEJaL*hlTLlNZu0Il6cigPaDbvB9P6m*q50guB7B08jridx*MGJtwhbH3UhMx/tutorial_9.png" width="734" class="align-full"/></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;">Imagem 9 - Implementação automática dos métodos da RoleProvider</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em> <span style="font-size: small; font-family: verdana, geneva;">Após clicar na opção mostrada na imagem, será criado vários métodos em nossa classe, mas apenas um nos interessa no momento. Esse que nos interessa se chama "<em>GetRolesForUser</em>". Nós iremos sobrescrever ele, esse método é o que foi falado acima, ele é responsável por retornar um array de strings que são as <em>Permissões</em> de um usuário. Veja como ficará o método:</span></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/JBLnOLNZ8Tov4fQpXIB8vxJGmhWZXAZiNwyPSrcqKy7RfSr6ncFolETx1JguT*TZfciPjNbxBITjn9C8iMZFSqXjNi1Q3Ber/tutorial_10.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/JBLnOLNZ8Tov4fQpXIB8vxJGmhWZXAZiNwyPSrcqKy7RfSr6ncFolETx1JguT*TZfciPjNbxBITjn9C8iMZFSqXjNi1Q3Ber/tutorial_10.png" width="585" class="align-full"/></span></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;">Imagem 10 - Sobrescrevendo o método GetRolesForUser</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em> <span style="font-size: small; font-family: verdana, geneva;">Bom amigos, agora nós precisamos informar a nossa aplicação, que nós alteramos a classe que fornece as Permissões de um usuário. Iremos fazer isso modificando ou inserindo uma tag no arquivo de configuração "<em>Web.config</em>".</span></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2">Abra este arquivo, e procure pela tag <em>&lt;roleManager&gt;</em> e delete ela. Feito isso, insira ela novamente só que informando agora o local da nova classe que criamos (PermissoesProvider) conforme a imagem abaixo:</span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/-r7oA4A24fGIuIAy8KNKBVuB02VrURVNPHT*r8kPNfdXbHCCEPM8nHR12cWer0SQ75TD8ntTmS5VzMU98fnMH7BOkj5fVQpc/tutorial_11.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/-r7oA4A24fGIuIAy8KNKBVuB02VrURVNPHT*r8kPNfdXbHCCEPM8nHR12cWer0SQ75TD8ntTmS5VzMU98fnMH7BOkj5fVQpc/tutorial_11.png" width="731" class="align-full"/></span></a></span></p>
<p></p>
<p></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;">Imagem 11 - Alterando o Web.config</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2"><i><br/></i></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2"><i><br/></i> O que nós fizemos acima, foi interceptar e alterar o jeito com que as permissões de um usuário são buscadas. </font></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2"><br/></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2">Agora é o ultimo passo para se concretizar o processo. Nós iremos sobrescrever um método da classe </font><span style="font-family: verdana, geneva; font-size: small;">"</span><em style="font-family: verdana, geneva; font-size: small;">AuthorizeAttribute</em><span style="font-family: verdana, geneva; font-size: small;">" que é a classe responsável pela anotação "<em>[Authorize]</em>". </span></span></p>
<p><span style="font-family: verdana, geneva; font-size: small; color: #000000;" class="font-size-2"><br/></span></p>
<p><span style="font-family: verdana, geneva; font-size: small; color: #000000;" class="font-size-2">Crie uma nova classe no diretorio "<em>Security</em>" chamada "<em>PermissoesFiltro</em>" e estenda ela a classe "<em>AuthorizeAttribute</em>" que pertence ao namespace <em>System.Web.Mvc. </em>Feito isso, sobrescreva o método "<em>OnAuthorization(AuthorizationContext filterContext)</em>" conforme a imagem abaixo:</span></p>
<p><span style="font-family: verdana, geneva; font-size: small;" class="font-size-2"><a href="http://api.ning.com:80/files/jLnxtKk9i4fGnbgSV4HTWCTwZ1wkh9MPUp3C-bRMv-XsppZ7v6Bo4yJSPbSBax*u4uiaYuvfjc2NrksiRWlC40zXDxzcicZA/tutorial_12.png" target="_self"><img src="http://api.ning.com:80/files/jLnxtKk9i4fGnbgSV4HTWCTwZ1wkh9MPUp3C-bRMv-XsppZ7v6Bo4yJSPbSBax*u4uiaYuvfjc2NrksiRWlC40zXDxzcicZA/tutorial_12.png" width="622" class="align-full"/></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;">Imagem 12 - Sobrescrevendo o método OnAuthorization</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em> <span style="font-size: small; font-family: verdana, geneva;">Nós sobrescrevemos esse método "<em>OnAuthorization</em>"</span> <font face="verdana, geneva" size="2">para poder dizer para a aplicação o que fazer quando um acesso for negado.</font></span></p>
<p><span class="font-size-2"><font face="verdana, geneva" size="2"><br/></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2">Agora finalmente, vamos voltar lá no Controller "<em>UsuarioController</em>"<i>. </i>Delete a anotação "<em>[Authorize]</em>" dele, e vamos implementar nele agora as permissões do nosso modo.</font></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2"><br/></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><font face="verdana, geneva" size="2">Vamos supor que a página "<em>/Usuarios/Principal</em>" só poderá ser acessada por usuários que possuem a permissão de "Gerente". Veja como ficaria a anotação do método:</font></span></p>
<p><span class="font-size-2"><span style="color: #000000;"><font face="verdana, geneva" size="2"><span style="color: #000000;"><a href="http://api.ning.com:80/files/LJL*eWhHQqug2p0T2kUtskLTPVNzMaZrNixkCGm*CRY8x9Jcx5FKM0NBZe1ta8LUZD6mu8lKVSEPwjivdB9PoQfVnFpV7lUP/tutorial_13.png" target="_self"><img src="http://api.ning.com:80/files/LJL*eWhHQqug2p0T2kUtskLTPVNzMaZrNixkCGm*CRY8x9Jcx5FKM0NBZe1ta8LUZD6mu8lKVSEPwjivdB9PoQfVnFpV7lUP/tutorial_13.png" width="693" class="align-full"/></a></span></font></span><span style="color: #000000;"><em><span style="font-size: small; font-family: verdana, geneva;">Imagem 13 - Configurando as permissões de uma localização</span></em></span></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em> <span style="font-size: small; font-family: verdana, geneva;">E vamos supor novamente, que para o usuário acessar a página acima, ele precisa ter duas permissões (Gerente e Avançado). Veja como ficaria a definição:</span></span></p>
<p><span style="font-size: small; font-family: verdana, geneva; color: #000000;" class="font-size-2"><a href="http://api.ning.com:80/files/Z0tTLn2S8PtCmPiplEqm2UL4NCiHZEAKl8H6TAPRqrEGiWwkh9gVGMrNNK4cumqI4FgCWFY7sOBav9IK*5BVOgiGD7FAtGCf/tutorial_14.png" target="_self"><span style="color: #000000;"><img src="http://api.ning.com:80/files/Z0tTLn2S8PtCmPiplEqm2UL4NCiHZEAKl8H6TAPRqrEGiWwkh9gVGMrNNK4cumqI4FgCWFY7sOBav9IK*5BVOgiGD7FAtGCf/tutorial_14.png" width="689" class="align-full"/></span></a></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;">Imagem 14 - Duas permissões em uma localização</span></em></span></p>
<p><span style="color: #000000;" class="font-size-2"><em><span style="font-size: small; font-family: verdana, geneva;"><br/></span></em> <span style="font-size: small; font-family: verdana, geneva;">Bom pessoal, é isso. O artigo ficou meio cansativo pois é muita coisa para se tratar, mais o MVC é uma forma muito inteligente para trabalhar com aplicações web. Espero que meu compartilhamento tenha sido útil. Obrigado.</span></span></p>
<p><span class="font-size-2"><font face="verdana, geneva" size="2"><br/></font></span></p>
<p><span style="color: #000000;" class="font-size-2"><strong><span style="font-size: small; font-family: verdana, geneva;">Para saber mais:<br/></span></strong></span><a href="http://devbrasil.net/group/aspnet" target="_blank">Confira outras publicações sobre este assunto na comunidade ASP.NET<br/></a><a href="http://www.fileserve.com/file/5NKbfR9/ExemploAutenticao%20-%20Basica.rar" target="_blank"><font face="verdana, geneva" size="2">ExemploAutenticacao - Basica.rar<br/></font></a><a href="http://www.fileserve.com/file/sPHjSKn/ExemploAutenticao%20-%20Final.rar" target="_blank">ExemploAutenticacao - Final.rar</a></p>
<p><span class="font-size-2"><font face="verdana, geneva" size="2"><br/></font></span></p>
<p><span class="font-size-2"><font face="verdana, geneva" size="2"><br/></font></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/sZQshsrTvKs" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;span class="font-size-2" style="font-family: verdana, geneva; color: #000000;"&gt;Neste artigo iremos ver uma maneira eficiente de autenticar usuários e definir permissões para os mesmos, ou seja, quais locais de uma aplicação (em ASP.NET MVC 4) o usuário poderá acessar. A autenticação e as permissões serão feitas a partir de informações contida em um banco de dados. Para desenvolver o exemplo do artigo estarei utilizando o Visual Web Developer 2010 (Visual Studio 2010), um banco de dados (SQL…&lt;/span&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/RfjjONm41dSmKiMhsgh2GpxElo9WiTRFLFpjEB9h6M7XU1mjU47cmPNFf8SSIXEBNHV1Ibx2BsfbaXDkAyO8hO787w8n8B9x/tutorial_1.png" length="0" type="image/png" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:158798</feedburner:origLink></item><item><title>Relacionamentos no SQL</title><link>http://feedproxy.google.com/~r/devbrasil/~3/LcGWKslu35k/2307362:BlogPost:158477</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ray Silva</dc:creator><pubDate>Wed, 28 Dec 2011 18:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-29:2307362:BlogPost:158477</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Para que você tenha um banco de dados relacional otimizado é muito importante que se atente ao design lógico do mesmo, inclusive as tabelas e as relações entre elas. Um bom design lógico torna-se o alicerce de um ótimo desempenho de banco de dados e dos aplicativos. A normalização do design lógico de um banco de dados envolve o uso de métodos formais para separar os dados em várias tabelas relacionadas.<br/> <br/> Várias tabelas estreitas com menos colunas são características de um banco de dados normalizado. Poucas tabelas largas com mais colunas são características de um banco de dados não normalizado.<br/> <br/> Muitas vezes, uma normalização razoável melhora o desempenho. Quando índices úteis estiverem disponíveis, o otimizador de consulta SQL Server é eficiente para selecionar junções rápidas e eficazes entre as tabelas.<br/> <br/> Para que você obtenha maior proveito desse artigo é necessário que você tenha conhecimento prévio sobre normalização de dados, uma vez que nesse artigo falaremos sobre <strong>relacionamentos SQL</strong>.<br/> <br/> <strong style="color: #99cc00;"><span class="font-size-3">Relacionamentos SQL</span><br/> <br/></strong> Relacionamentos são informações relacionadas entre sí, mas geralmente armazenadas em diferentes tabelas ou de alguma forma em uma tabela relacionada com ela mesma.<br/> <br/> Baseados em campos em comum, normalmente campos chaves, utilizamos o parâmetro <strong>JOIN</strong> ou alguma de suas variações.<br/> <br/> A sintaxe do parâmetro <strong>JOIN</strong> é a seguinte:<br/> <br/> <em><strong>SELECT [colunas]</strong></em><br/> <em><strong>FROM Tabela1</strong></em><br/> <em><strong>JOIN Tabela2 On Tabela1.FK = Tabela2.PK</strong></em><br/> <br/> Repare que a condição do relacionamento é basicamente informar qual campo da tabela1 é igual ao campo da tabela2, geralmente esses campos são chaves sendo um deles chave primária e outro chave estrangeira, porém, isso não é uma regra.<br/> <br/> O parâmetro <strong>JOIN</strong> possue várias variações e estas variações estão implementadas na maior parte dos bancos de dados disponível atualmente.<br/> <br/> A seguir, veremos algumas das variações dos <strong>JOIN</strong>.<br/> <br/> Para ilustrar o exemplo, considere as seguintes tabelas criadas no banco de dados SQL Server 2008.</p>
<p><a href="http://api.ning.com:80/files/PZjn-E6mESKn6zL83WIbOcLZWm2GjY6MFBWYeELnMPx3e6KLYWHr5B4fzUmhM-TrGoqGW1ZSErflr*qicC9*HiTLT5ySOtxz/001.jpg" target="_self"><img src="http://api.ning.com:80/files/PZjn-E6mESKn6zL83WIbOcLZWm2GjY6MFBWYeELnMPx3e6KLYWHr5B4fzUmhM-TrGoqGW1ZSErflr*qicC9*HiTLT5ySOtxz/001.jpg" width="517" class="align-center"/></a><strong style="color: #99cc00;"><span class="font-size-3">Inner Join</span><br/> <br/></strong> O Inner Join é o Join Padrão utilizado nas operações de relacionamento nos bancos de dados quando nenhum outro Join é utilizado.<br/> <br/> Ele gera o produto cartesiano entre as tabelas.<br/> <br/> Gerar o produto cartesiano significa basicamente que esse tipo de join combina todas as linhas da primeira tabela com todas as linhas da segunda que satisfaçam as condições da cláusula especificada no relacionamento.<br/> <br/> Um exemplo de Inner Join pode ser visto no seguinte comando SQL:<br/>  </p>
<p><a href="http://api.ning.com:80/files/JbPnViZFyu0iAtoHbG*eOhCDcjUwXpPIgJZ1wyQ9F5t70o4HQgdwinGVvKUK*VrzkA9iVwb-e5Eje9HCftflkN8MQ-PdpPKi/002.jpg" target="_self"><img src="http://api.ning.com:80/files/JbPnViZFyu0iAtoHbG*eOhCDcjUwXpPIgJZ1wyQ9F5t70o4HQgdwinGVvKUK*VrzkA9iVwb-e5Eje9HCftflkN8MQ-PdpPKi/002.jpg?width=750" width="750" class="align-center"/></a><br/> Repare que o resultado do SQL retorna 6 colunas, ou seja,  todas as colunas da tabela <strong>USUARIO</strong> e também todas as colunas da tabela <strong>DEPARTAMENTO</strong>. <br/> <br/> Repare também que no resultado nós obtemos dois retornos de "COD_DEPARTAMENTO". Isso ocorre porque ao especificarmos <strong>"*"</strong> em nosso <strong>SELECT</strong>, ele retorna todas as colunas das tabelas que solicitamos.<br/> <br/> Vale ressaltar também que para montar relacionamentos não é obrigatório que os campos utilizados na condição do relacionamento tenham os mesmos nomes, eles podem ter nomes diferentes desde que seja informada a condição do relacionamento no SQL.<br/> <br/> <strong><span style="color: #99cc00;"><span class="font-size-3">Equi Join</span><br/> <br/></span></strong> O Equi Join é similar ao primeiro join apresentado, com a característica que as chaves do relacionamento apresentado <span style="text-decoration: underline;">devem</span> haver os mesmos nomes.<br/> <br/> Na verdade o Equi Join é uma forma simplificada de escrever o Inner Join quando temos os campos relacionados com os mesmos nomes.<br/> <br/> Analise o SQL abaixo:<br/> <br/> <strong>Select *</strong></p>
<p><strong>From Usuario</strong><br/> <strong>Join Departamento USING (Cod_Departamento);<br/> <br/></strong> O SQL acima retornará todos os campos de ambas as tabelas visto que ambas tem a coluna com o nome "COD_DEPARTAMENTO", contudo, no  SQL Server e Sybase a clausula "USING" não é suportada.<br/> <br/> <strong><span style="color: #99cc00;"><span class="font-size-3">Non Equi Join</span><br/> <br/></span></strong> É possível também criar relacionamentos entre tabelas que não possuam campos em comum.<br/> <br/> Considere as seguintes tabelas:</p>
<p><a href="http://api.ning.com:80/files/NcaNlDIstakxgZ3O-QO9rOCzYVdnutQyFskMmZWwebPG9g8T3OaZjDCKa*idQRKkCRrTHXRbqqYfgpH3wTegmNnvdSUIEsI8/003.jpg" target="_self"><img src="http://api.ning.com:80/files/NcaNlDIstakxgZ3O-QO9rOCzYVdnutQyFskMmZWwebPG9g8T3OaZjDCKa*idQRKkCRrTHXRbqqYfgpH3wTegmNnvdSUIEsI8/003.jpg" width="477" class="align-center"/></a> E os dados populados: </p>
<p><a href="http://api.ning.com:80/files/45638RSqtVDjMmw-TNkhJVGz5fgH1tkflYcKgydfmdNbzGwH8WJWVDMvztoag0US4Tk3rxbxs8tZhbWoEB9uCc9ZJg4*suAH/004.jpg" target="_self"><img src="http://api.ning.com:80/files/45638RSqtVDjMmw-TNkhJVGz5fgH1tkflYcKgydfmdNbzGwH8WJWVDMvztoag0US4Tk3rxbxs8tZhbWoEB9uCc9ZJg4*suAH/004.jpg" width="405" class="align-center"/></a><br/> A tabela <strong>PESSOAS</strong> apresenta algumas pessoas de uma empresa e seus salários e a tabela <strong>SALARIO</strong> representa alguns cargos com faixa salarial cadastrada.<br/> <br/> Para que possamos criar um relacionamento onde o resultado seja o nome da pessoa, seu salário e qual é o seu cargo baseado na sua faixa salarial, podemos fazer a expressão SQL dessa forma:<br/> <br/> <strong>SELECT P.NOME, S.CARGO, P.SALARIO</strong></p>
<p><strong>FROM PESSOAS P</strong><br/> <strong>INNER JOIN SALARIO S ON P.SALARIO BETWEEN S.SALARIO_INICIAL AND S.SALARIO_FINAL<br/> <br/></strong> Note que após o parâmetro "FROM", temos o nome da tabela "PESSOAS" e logo em seguida um "P". Essa é uma forma de criar "alias" (apelidos) para as tabelas.<br/> <br/> O intuito de criar apelidos para as tabelas é facilitar a forma como escrevemos a expressão SQL, ou seja, estamos dizendo que P é igual PESSOAS na expressão SQL.<br/> <br/> O operador <strong>BETWEEN</strong> é utilizado para estabelecer um range entre um valor inicial e um valor final.<br/> <br/> O resultado dessa expressão SQL é: </p>
<p><a href="http://api.ning.com:80/files/DVcXntj8IQyWyIeC4iaqC7*7HymBxebNKIg2HoY0HdW2UpHNXB**gVh37QAYBnZ4sKlu*H6b0vxU4gj4Kr6UMR1*Z3eL4r5s/005.jpg" target="_self"><img src="http://api.ning.com:80/files/DVcXntj8IQyWyIeC4iaqC7*7HymBxebNKIg2HoY0HdW2UpHNXB**gVh37QAYBnZ4sKlu*H6b0vxU4gj4Kr6UMR1*Z3eL4r5s/005.jpg?width=750" width="750" class="align-center"/></a><br/> Note que o <strong>Non Equi Join</strong> é apenas o nome dado ao termo de qualquer uma das outras expressão <strong>JOIN</strong> que não possua um campo em comum entre as tabelas.<br/> <br/> <strong style="color: #99cc00;"><span class="font-size-3">Left Join</span><br/> <br/></strong> Esse tipo de <strong>JOIN</strong> obtém no resultado algumas linhas que não satisfazem a condição especificada do relacionamento em questão.<br/> <br/> A propriedade <strong>LEFT</strong> que existe nesse <strong>JOIN</strong>, indica que as linhas da tabela à esquerda irão aparecer no resultado, mesmo que os registros não satisfaçam as condições especificadas no relacionamento.<br/> <br/> Para exemplificar melhor a idéia, considere as tabelas abaixo populadas:<br/> <br/> <strong>Tabela PESSOAS:<br/>  </strong></p>
<table border="1" cellspacing="0">
<tbody><tr><td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>NOME</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>CIDADE</b></p>
</td>
</tr>
<tr><td width="144" valign="top"><p>RAY SILVA</p>
</td>
<td width="144" valign="top"><p>111.111.111-11</p>
</td>
<td width="144" valign="top"><p>JUNDIAI</p>
</td>
</tr>
<tr><td width="144" valign="top"><p>GUILHERME SILVA</p>
</td>
<td width="144" valign="top"><p>222.222.222-22</p>
</td>
<td width="144" valign="top"><p>JUNDIAI</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p><strong>Tabela VEICULOS:<br/>  </strong></p>
<table border="1" cellspacing="0">
<tbody><tr><td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>VEICULO</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>PLACA</b></p>
</td>
</tr>
<tr><td width="144" valign="top"><p>111.111.111.11</p>
</td>
<td width="144" valign="top"><p>PEUGEOUT 206</p>
</td>
<td width="144" valign="top"><p>AAA-0000</p>
</td>
</tr>
<tr><td width="144" valign="top"><p>NULL</p>
</td>
<td width="144" valign="top"><p>FIESTA</p>
</td>
<td width="144" valign="top"><p>BBB-1111</p>
</td>
</tr>
</tbody>
</table>
<p><br/> Ao executarmos o SQL:<br/> <br/> <strong>SELECT * FROM PESSOAS<br/></strong> <strong>LEFT JOIN VEICULOS ON PESSOAS.CPF = VEICULOS.CPF<br/> <br/></strong> O resultado será:<br/>  </p>
<p> </p>
<table border="1" cellspacing="0">
<tbody><tr><td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>NOME</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>CIDADE</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>VEICULO</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>PLACA</b></p>
</td>
</tr>
<tr><td width="96" valign="top"><p>RAY SILVA</p>
</td>
<td width="96" valign="top"><p>111.111.111.11</p>
</td>
<td width="96" valign="top"><p>JUNDIAI</p>
</td>
<td width="96" valign="top"><p>111.111.111.11</p>
</td>
<td width="96" valign="top"><p>PEUGEOUT 206</p>
</td>
<td width="96" valign="top"><p>AAA-0000</p>
</td>
</tr>
<tr><td width="96" valign="top"><p>GUILHERME SILVA</p>
</td>
<td width="96" valign="top"><p>222.222.222.22</p>
</td>
<td width="96" valign="top"><p>JUNDIAI</p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
</tr>
</tbody>
</table>
<p><br/> Repare que o todos os dados da tabela da ESQUERDA (LEFT) foram selecionados.<br/> <br/> Com esse exemplo acima, podemos entender perfeitamente como o <strong>RIGHT JOIN</strong> funciona, considerando que os dados serão retornados da tabela da direita por sua vez.<br/> <br/> <strong><span style="color: #99cc00;" class="font-size-3">Full Join</span><br/> <br/></strong> Utilizando o mesmo exemplo de tabelas acima, o Full Join atua de forma que <strong>TODOS</strong> os registros, independentes do relacionamento feito serão apresentados. Podemos considerar que o Full Join nesse caso traria o resultado tanto do LEFT JOIN quanto do RIGHT Join.</p>
<table border="1" cellspacing="0">
<tbody><tr><td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>NOME</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>CIDADE</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>VEICULO</b></p>
</td>
<td width="96" valign="top" style="background-color: #99cc00;"><p align="center"><b>PLACA</b></p>
</td>
</tr>
<tr><td width="96" valign="top"><p>RAY SILVA</p>
</td>
<td width="96" valign="top"><p>111.111.111.11</p>
</td>
<td width="96" valign="top"><p>JUNDIAI</p>
</td>
<td width="96" valign="top"><p>111.111.111.11</p>
</td>
<td width="96" valign="top"><p>PEUGEOUT 206</p>
</td>
<td width="96" valign="top"><p>AAA-0000</p>
</td>
</tr>
<tr><td width="96" valign="top"><p>GUILHERME SILVA</p>
</td>
<td width="96" valign="top"><p>222.222.222.22</p>
</td>
<td width="96" valign="top"><p>JUNDIAI</p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
</tr>
<tr><td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p> </p>
</td>
<td width="96" valign="top"><p>FIESTA</p>
</td>
<td width="96" valign="top"><p>BBB-1111</p>
</td>
</tr>
</tbody>
</table>
<p><strong><br/> <span style="color: #99cc00;" class="font-size-3">Self Join</span><br/> <br/></strong> Até então nós falamos como relacionar diferentes tabelas, contudo, também é possível fazer um relacionamento da tabela com ela mesma.<br/> <br/> Considere a tabela populada abaixo para esse exemplo:<br/> <br/> <strong>Tabela INDICADOS<br/>  </strong></p>
<table border="1" cellspacing="0">
<tbody><tr><td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>NOME</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>CPF</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>CIDADE</b></p>
</td>
<td width="144" valign="top" style="background-color: #99cc00;"><p align="center"><b>INDICADO</b></p>
</td>
</tr>
<tr><td width="144" valign="top"><p>RAY SILVA</p>
</td>
<td width="144" valign="top"><p>111.111.111.11</p>
</td>
<td width="144" valign="top"><p>JUNDIAI</p>
</td>
<td width="144" valign="top"><p> </p>
</td>
</tr>
<tr><td width="144" valign="top"><p>EDUARDO ALBA</p>
</td>
<td width="144" valign="top"><p>222.222.222.22</p>
</td>
<td width="144" valign="top"><p>JUNDIAI</p>
</td>
<td width="144" valign="top"><p>111.111.111.11</p>
</td>
</tr>
</tbody>
</table>
<p><br/> A idéia da tabela é salvar o nome, cpf e cidade de um usuário e se ele foi indicado por alguém. Podemos considerar então que a indicação seja feita através da coluna CPF. Dessa forma, Eduardo foi indicado por Ray.<br/> <br/> Para conseguirmos essa informação, temos que fazer um relacionamento da tabela com ela mesma!<br/> <br/> Considere a expressão SQL abaixo:<br/> <br/> <strong>SELECT A.NOME, B.NOME AS INDICADO_POR</strong></p>
<p><strong>FROM INDICADOS A JOIN INDICADOS B ON A.INDICADO = B.CPF<br/> <br/></strong> O resultado será:</p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top" style="background-color: #99cc00;"><p align="center"><b>NOME</b></p>
</td>
<td width="288" valign="top" style="background-color: #99cc00;"><p align="center"><b>INDICADO_POR</b></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>EDUARDO ALBA</p>
</td>
<td width="288" valign="top"><p>RAY SILVA</p>
</td>
</tr>
</tbody>
</table>
<p><br/> Nesse artigo pudemos aprender algumas maneiras de trabalhar com relacionamentos no SQL. É muito importante que a modelagem do seu banco de dados seja feita da melhor maneira possível para assegurar que não hajam redundâncias e também melhorar o desempenho do seu banco de dados e das aplicações que acessarem o banco.<br/> <br/> <strong>Para saber mais:</strong></p>
<p><a href="http://devbrasil.net/group/sqlserver" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade SQL Server<br/></a> <a href="http://pt.wikipedia.org/wiki/Normaliza%C3%A7%C3%A3o_em_banco_de_dados" target="_blank">Aprofunde seus conhecimentos sobre normalização de banco de dados</a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/LcGWKslu35k" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Para que você tenha um banco de dados relacional otimizado é muito importante que se atente ao design lógico do mesmo, inclusive as tabelas e as relações entre elas. Um bom design lógico torna-se o alicerce de um ótimo desempenho de banco de dados e dos aplicativos. A normalização do design lógico de um banco de dados envolve o uso de métodos formais para separar os dados em várias tabelas relacionadas.&lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; Várias tabelas estreitas com menos colunas são características de um banco de…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/PZjn-E6mESKn6zL83WIbOcLZWm2GjY6MFBWYeELnMPx3e6KLYWHr5B4fzUmhM-TrGoqGW1ZSErflr*qicC9*HiTLT5ySOtxz/001.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:158477</feedburner:origLink></item><item><title>Primeiros passos desenvolvimento Android usando Mono e Visual Studio 2010</title><link>http://feedproxy.google.com/~r/devbrasil/~3/HPFATPornI8/2307362:BlogPost:158159</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Márcio Araújo</dc:creator><pubDate>Mon, 26 Dec 2011 13:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-26:2307362:BlogPost:158159</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>O mono android é um plugin para o Visual Studio que pertimite a criação de aplicativos para a plataforma Android. Os aplicativos desenvolvidos podem ser facilmente  utilizado em seu smartphone ou tablet desde que possua essa plataforma. Para iniciar você precisa instalar o Visual Studio 2010, Android SDK, Java SDK e Mono Android preparando os eu ambiente de desenvolvimento para a construção de aplicativos nessa plataforma. Cada pacote desse traz uma característica conforme descrito abaixo:</p>
<p><strong><br/> Visual Studio 2010</strong></p>
<p>Visual Studio é a ferramenta de desenvolvimento da Microsoft.</p>
<p><strong>O java SDK</strong></p>
<p>O Java Development Kit( JDK ) produto destinado para desenvolvedores em Java liberada pela Oclare Corporation.</p>
<p><strong>Android SDK</strong><br/>  O Android SDK é o kit de desenvolvimento para a plataforma Android.</p>
<p><strong>Mono Android<br/></strong> O mono android é o plugin desenvolvido pela xamarin, o plugin não é grátis, porém é possível efetuar o download e testá-lo.</p>
<p><br/> Após instalação no visual studio apacerá da seguinte forma:<br/>  </p>
<p><a href="http://api.ning.com:80/files/Q46eeqa19KE8JngSXJh5WzODSiwzWv4SNkxpoUQZVoUQaFEk7lM9QaJUc1pLWqlZa4nkA1wqjLPhVK*cceCOn-vsEDCZ47tO/MonoAndroid.png" target="_self"><img src="http://api.ning.com:80/files/Q46eeqa19KE8JngSXJh5WzODSiwzWv4SNkxpoUQZVoUQaFEk7lM9QaJUc1pLWqlZa4nkA1wqjLPhVK*cceCOn-vsEDCZ47tO/MonoAndroid.png?width=600" width="600" class="align-center"/></a></p>
<p></p>
<p>Entendendo o escopo : </p>
<p><a href="http://api.ning.com:80/files/6OZtK*X*Bro82zp2UEUEY2JlIYclinYAmLEp2Rrlq3iukyu71t*duyBTQcQfIs8tqXVIL6kvvSM-qEa9AE0J-dYwrqdJJ9C9/MonoAndroid2.png" target="_self"><img src="http://api.ning.com:80/files/6OZtK*X*Bro82zp2UEUEY2JlIYclinYAmLEp2Rrlq3iukyu71t*duyBTQcQfIs8tqXVIL6kvvSM-qEa9AE0J-dYwrqdJJ9C9/MonoAndroid2.png?width=667" width="667" class="align-center"/></a></p>
<p></p>
<p>[Activity(Label ] : Nome do aplicativo que será exibido na tela após a execução.</p>
<p>Icon = "@drawable/icon" = Pasta do ícone do aplicativo que ficará nos aplicativos instalados.</p>
<p>MainLauncher : Verifica se a tela é principal do aplicativo.</p>
<p>Class activity : classe principal, toda classe para aplicação android deve ser derivada da classe activity.</p>
<p>SetContentView : Responsável pela exibição da tela da aplicação.</p>
<p>Button.Click : Inserção do código no botão.<br/> <br/> Com o mono Android você está preparado a desenvolver para plataforma Android usando todo o seu conhecimento na linguagem C#. É óbvio que existe outras ferramentas destinadas para o desenvolvimento na plataforma android, mas quem gosta do Visual Studio e tem todo o conhecimento na ferramenta vale a pena instalar e tirar as conclusões.</p>
<p><strong><br/></strong></p>
<p><strong>Para saber mais:<br/></strong> <a href="http://devbrasil.net/group/mono-android" target="_self">Aprofunde seus conhecimentos sobre este tema na comunidade mono android<br/></a> <a href="http://developer.android.com/sdk/index.html" target="_blank">Download do android sdk<br/></a> <a href="http://www.oracle.com/technetwork/java/javase/downloads/index.html" target="_blank">Download do java sdk<br/></a> <a href="http://xamarin.com/monoforandroid" target="_blank">Download do mono android</a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/HPFATPornI8" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;O mono android é um plugin para o Visual Studio que pertimite a criação de aplicativos para a plataforma Android. Os aplicativos desenvolvidos podem ser facilmente  utilizado em seu smartphone ou tablet desde que possua essa plataforma. Para iniciar você precisa instalar o Visual Studio 2010, Android SDK, Java SDK e Mono Android preparando os eu ambiente de desenvolvimento para a construção de aplicativos nessa plataforma. Cada pacote desse traz uma característica conforme descrito…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/Q46eeqa19KE8JngSXJh5WzODSiwzWv4SNkxpoUQZVoUQaFEk7lM9QaJUc1pLWqlZa4nkA1wqjLPhVK*cceCOn-vsEDCZ47tO/MonoAndroid.png" length="0" type="image/png" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:158159</feedburner:origLink></item><item><title>Comparando dois arquivos em C#</title><link>http://feedproxy.google.com/~r/devbrasil/~3/LZvLpYEtajc/2307362:BlogPost:109743</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Felipe Guerra Dos Santos</dc:creator><pubDate>Wed, 21 Dec 2011 12:00:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-21:2307362:BlogPost:109743</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Descobrir se dois Arquivos são iguais apenas pelo seu Nome, é inviável por questões Lógicas, para isso que existem outras alternativas.</p>
<p>O Método que mais me satisfaz, é a Comparação Bit-A-Bit, ao qual comparamos cada Bit do Arquivo A, com o do Arquivo B, ao invés de fazermos Comparações com o Nome dos dois Arquivos, que acaba sendo uma maneira errada de se proceder.</p>
<p> </p>
<p> Para começar a trabalhar com este tipo de comparação, criaremos um Aplicativo de Console, indo em: <strong>FILE-&gt;New-&gt; Project-&gt;Windows-&gt;ConsoleApplication</strong>, dentro de nosso Visual Studio 2010.   Nomearemos o Projeto como: "<em>ComparandoArquivosCSharp"</em>, como mostra a figura:</p>
<p> </p>
<p><img src="http://api.ning.com:80/files/KwFGjdMAi8yIyPhPjUjBo4mtWmuMXlBdu*xMN2QZkzVdb6FkM*iyhgiZ9GqHbPmbRwH0qLhah3MHWFkXdD2Kmse7wHn5W0Gt/vsWindow.PNG?width=750" width="750" class="align-center"/>Agora, precisamos "chamar" as Bibliotecas: <em>System.IO e System no Cabeçalho de nosso Código.</em> Dessas Bibliotecas, tiraremos várias Classes essenciais para o que queremos fazer.</p>
<p></p>
<blockquote><p><a href="http://api.ning.com:80/files/oNb590GLnu11tFsTExcgBqq8dSDmactc3P-dz7QAMPspUWb1xDrcMWUfcs2EdQGoIKc5ilVY9tCjjdstFR*Egnu0*NOWFS1Q/usingHeader.PNG" target="_self"><img src="http://api.ning.com:80/files/oNb590GLnu11tFsTExcgBqq8dSDmactc3P-dz7QAMPspUWb1xDrcMWUfcs2EdQGoIKc5ilVY9tCjjdstFR*Egnu0*NOWFS1Q/usingHeader.PNG" width="212" class="align-center"/></a></p>
<p> </p>
</blockquote>
<p>  O próximo passo é começar a Trabalhar com a verificação dos Arquivos, para isso, vamos criar duas Variáveis que armazenarão o Diretórios de cada Arquivo, e depois fazer com que cada Arquivo seja convertido para uma "Arrays" do tipo byte[]:</p>
<p> </p>
<p><a href="http://api.ning.com:80/files/FhbuyBkoBwU2Hhhd2XEMnmr0QQ7YGqaBj4WymgkoW2Wof71P-ODrUzLC1505VtXDJm6BCIQW8Vcsn8XIGxWX3TcOsF5jUAE2/arrayscONTENT.PNG" target="_self"><img src="http://api.ning.com:80/files/FhbuyBkoBwU2Hhhd2XEMnmr0QQ7YGqaBj4WymgkoW2Wof71P-ODrUzLC1505VtXDJm6BCIQW8Vcsn8XIGxWX3TcOsF5jUAE2/arrayscONTENT.PNG?width=750" width="750" class="align-center"/></a></p>
<p> </p>
<p> </p>
<p>Agora ficou fácil, basta que comparemos cada Bit de cada "Array", daí o nome: Comparação BIT-A-BIT, e caso o Arquivo A seja igual ao Arquivo B, mostraremos uma Mensagem no Console dizendo que "São Iguais", senão, mostraremos uma Mensagem dizendo: "São diferentes":  </p>
<p> </p>
<p><a href="http://api.ning.com:80/files/zADXvfJfiQ8-rgdqjfN6-aYfoiupawkF4Fv9TkDrUCXgDj0Uk88WZ4JGfagfS4KBMda04Hk8FynHrQzqBGjG82J4KGeASB96/comparaoBit.PNG" target="_self"><img src="http://api.ning.com:80/files/zADXvfJfiQ8-rgdqjfN6-aYfoiupawkF4Fv9TkDrUCXgDj0Uk88WZ4JGfagfS4KBMda04Hk8FynHrQzqBGjG82J4KGeASB96/comparaoBit.PNG?width=750" width="750" class="align-full"/></a></p>
<p></p>
<p> Trabalhamos com um Arquivo pré-definido, porém, com a finalidade de mostrar o poder desta Técnica, poderíamos possibilitar que o Usuário selecionasse um Arquivo dentro de seu Computador, ou mesmo usar isso em um Aplicativo ASP.NET.</p>
<p> Comparações "Bit-a-Bit", são eficazes quando queremos comparar dois arquivos com mais "certeza" e com mais "Segurança" em C#, porém existe vários outros Métodos. </p>
<p><strong><br/></strong></p>
<p><strong>Para Saber Mais:</strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/system.io.aspx">Informações sobre a Biblioteca System.IO no MSDN </a></strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/system.io.aspx"></a><a href="http://devbrasil.net/group/cdesenvolvendores">Aprenda mais sobre C# no Grupo correspondente no DevBrasil</a></strong></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/LZvLpYEtajc" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Descobrir se dois Arquivos são iguais apenas pelo seu Nome, é inviável por questões Lógicas, para isso que existem outras alternativas.&lt;/p&gt;
&lt;p&gt;O Método que mais me satisfaz, é a Comparação Bit-A-Bit, ao qual comparamos cada Bit do Arquivo A, com o do Arquivo B, ao invés de fazermos Comparações com o Nome dos dois Arquivos, que acaba sendo uma maneira errada de se proceder.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; Para começar a trabalhar com este tipo de comparação, criaremos um Aplicativo de Console, indo em:…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:109743</feedburner:origLink></item><item><title>O que é Boxing and Unboxing</title><link>http://feedproxy.google.com/~r/devbrasil/~3/JOvS6nSvTzI/2307362:BlogPost:156533</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ray Silva</dc:creator><pubDate>Mon, 19 Dec 2011 07:00:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-19:2307362:BlogPost:156533</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>O .NET Framework oferece diversos tipos pré-definidos que são necessários para a criação de diversas aplicações. Esses tipos são utilizados nas aplicações para que possamos guardar valores e também criarmos nossos próprios tipos. Nesse artigo você entenderá o conceito básico de Box e Unboxing, considerado muito "perigoso" quando nós falamos em performance.</p>
<p> </p>
<p>Antes de falar de Box e unboxing é importante saber um pouco sobre a arquitetura e os tipos de dados dentro do .NET Framework.</p>
<p> </p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>CTS - Common Type System</strong></span></p>
<p> </p>
<p>Os tipos são fundamentais em qualquer linguagem de programação. A Microsoft tem a idéia de tornar tudo o mais padrão e integrado possível, ela criou uma especificação de tipos chamada de "Common Type System" (CTS) que descreve bem os tipos de dados e como eles se comportam.</p>
<p> </p>
<p>É importante ressaltar que esses tipos são compartilhados em todas as linguagens do .NET Framework, ou seja, os mesmos tipos que você utiliza em uma aplicação C# você também consegue trabalhar em VB.NET.</p>
<p> </p>
<p>Não tem como falar de CTS e não citar a mais importante regra definida por ele: Todos os tipos devem herdar direta ou inderetament de <strong><span style="color: #000000;">System.Object</span></strong>. Esta é a raiz de todos os tipos dentro do .NET Framework e também é a raiz para todos os tipos que você eventualmente vier a criar.</p>
<p> </p>
<p> </p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>CLS - Common Language Specification</strong></span></p>
<p> </p>
<p>Já que dissemos que CTS é compartilhada em todas as linguagens, vale ressaltar que a Microsoft criou a CLS (Common Language Specification) que é responsável por especificar o conjunto mínimo de recursos que devem ser suportados quando os códigos são gerados na CLR.</p>
<p> </p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>CLR - Common Language RunTime</strong></span></p>
<p> </p>
<p>O coração da plataforma .NET é o <b>CLR</b> (<b>Common Language Runtime</b>), que é uma aplicação similar a uma máquina virtual (igual aquela mesma do Java) que se encarrega de providenciar a execução das aplicações para ela escritas.</p>
<p> </p>
<p>São oferecidos a estas aplicações numerosos serviços que facilitam seu desenvolvimento e manutenção que favorece sua confiança e segurança. O CLR é o verdadeiro responsável pela interoperabilidade entre as linguagens suportadas pela plataforma .NET.</p>
<p> </p>
<p>O CLR suporta duas espécies de tipos: <strong>Tipos-Valor (Value types)</strong> e <strong>Tipos-Referência (Reference Types)</strong>.</p>
<p> </p>
<p>Os tipo-valor são variáveis que diretamente contém o seu próprio valor, sendo assim, cada variável mantém a cópia dos seus dados. Se você fizer alguma operação que manipule os valores dessa váriavel, consequentemente o seu valor não será afetado.</p>
<p> </p>
<p>Já os tipos-referência contém a referência em memória que aponta para o valor dos dados ao invés dos valores propriamente ditos. Como os tipos-referência apontam para um local, uma operação poderá manipular seu valor original.</p>
<p> </p>
<p>Tendo esse conhecimento básico, agora sim podemos falar de Box e Unboxing.</p>
<p><span class="font-size-3" style="color: #99cc00;"><strong><br/></strong></span></p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>Boxing</strong></span></p>
<p> </p>
<p>Boxing é o processo de converter um tipo-valor para um tipo-objeto ou qualquer tipo de interface implementada por esse tipo-valor. Quando a CLR faz um "box" em um tipo-valor, ele "encapsula" o valor dentro de um System.Object e guarda esse valor na memória heap.</p>
<p> </p>
<p>Por sua vez, o Unboxing retira o tipo-valor do objeto. O boxing é implícito e o unboxing também.</p>
<p> </p>
<p>O conceito de boxing e unboxing recai na idéia que os tipos de dados de uma forma geral pode ser tratado como um objeto.</p>
<p> </p>
<p>No exemplo a seguir, a variável inteira realiza um "box" e é assimilada ao objeto.</p>
<p> </p>
<pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"></pre>
<pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"><span style="color: blue;">int</span> i = 123;             <span style="color: green;"><br/> //A linha a seguir faz um box na variável i, copiando o valor de i para um objeto.</span><span style="color: blue;"><br style="color: green;"/>object</span> o = i;</pre>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/decB3Cu6GL5SVlFYoyJvgJz3LL2dmrGShtu2yytEPRxYwbojuiIhoJYxHOoG106wY21BsIh0vQymQf00ejL0N7yKCRquKkfO/001.jpg"><img class="align-center" src="http://api.ning.com:80/files/decB3Cu6GL5SVlFYoyJvgJz3LL2dmrGShtu2yytEPRxYwbojuiIhoJYxHOoG106wY21BsIh0vQymQf00ejL0N7yKCRquKkfO/001.jpg" width="200"/></a>Também é possível fazer o boxing implicitamente mas o boxing explícito nunca é requerido.</p>
<p><span class="font-size-3" style="color: #99cc00;"><strong><br/></strong></span></p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>Unboxing</strong></span></p>
<p> </p>
<p>O Unboxing é a conversão explícita de um tipo objeto ou algum tipo interface para o tipo-valor.</p>
<p> </p>
<p>O processo de unboxing consiste em:</p>
<p> </p>
<p>- Checar a instância do objeto para ter certeza que os valores são do mesmo tipo</p>
<p>- Copiar o valor da instância para a variável tipo-valor.</p>
<p> </p>
<pre style="font-family: Consolas; font-size: 13px; color: black; background: none repeat scroll 0% 0% white;"><span style="color: blue;">int</span> i = 123;<br/><span style="color: green;">// a é uma variável tipo-valor</span><br/><span style="color: blue;">object</span> o = i;             <span style="color: green;"><br/> //boxing foi feito, ou seja, o valor foi colocado em um objeto</span><br/><span style="color: blue;">int</span> j = (<span style="color: blue;">int</span>)o;             <span style="color: green;"><br/> // unboxing foi feito na variável j</span></pre>
<p><br/><br/> A figura a seguir representa o resultado do código anterior:<br/><br/> <a target="_self" href="http://api.ning.com:80/files/dbtFd5KAGAKrvpnygC6U48vrT9*Sqll-q2-iM6SdaMcH4oQeuT8qUnu7ryhZlMsoqPI9n0o9vC**-VWiuLWWCfS6dsc1y6S5/002.jpg"><img class="align-center" src="http://api.ning.com:80/files/dbtFd5KAGAKrvpnygC6U48vrT9*Sqll-q2-iM6SdaMcH4oQeuT8qUnu7ryhZlMsoqPI9n0o9vC**-VWiuLWWCfS6dsc1y6S5/002.jpg" width="200"/></a><br/><br/> Para o unbox ter sucesso em tempo de execução, o ítem que estiver sofrendo o Unbox tem que conter<br/> uma referência para o objeto que foi criado previamente pelo box feito da instância do tipo-valor.<br/><br/> Tentativas de Unbox com valores null causam exceção "<em>NullReferenceException</em>".<br/><br/> Tentativas de fazer Unbox com uma referência que tenha um tipo-valor incompatível resulta em<br/> <em>uma exceção "<span style="color: green;"><span style="color: #000000;">InvalidCastException</span></span>".</em></p>
<p><span style="color: #99cc00;" class="font-size-3"><strong><br/></strong></span></p>
<p><span style="color: #99cc00;" class="font-size-3"><strong>Performance</strong></span></p>
<p></p>
<p>Com relação a performance, boxing e unboxing são computacionalmente processos custosos para a CPU. Quando é feito boxing em um tipo-valor, um novo objeto deve ser alocado e construído. Também quando é custoso para a CPU quando é feito um Cast no unboxing;</p>
<p><em><br/></em></p>
<p>Esse artigo relatou uma noção básica sobre CTS, CLS, CLR, tipos-valor e tipos-referência e<br/> por fim uma breve explicação sobre Box e Unboxing. É muito importante que nós, desenvolvedores,<br/> saibamos como a arquitetura do .NET Framework funciona para que estejamos aptos a escrever<br/> código com qualidade!</p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>Para saber mais:</strong></span></p>
<p><a href="http://devbrasil.net/group/cdesenvolvendores" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade C#</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/490f96s2.aspx" target="_blank">Aprofunde seus conhecimentos sobre tipos-referência</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/s1ax56ch.aspx" target="_blank">Aprofunde seus conhecimentos sobre tipo-valor</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/ms173196.aspx" target="_blank">Aprofunde seus conhecimentos sobre performance</a></p>
<p><a href="http://msdn.microsoft.com/en-us/library/yz2be5wk.aspx" target="_blank">Referência dos códigos fontes</a></p>
<p></p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/JOvS6nSvTzI" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;O .NET Framework oferece diversos tipos pré-definidos que são necessários para a criação de diversas aplicações. Esses tipos são utilizados nas aplicações para que possamos guardar valores e também criarmos nossos próprios tipos. Nesse artigo você entenderá o conceito básico de Box e Unboxing, considerado muito "perigoso" quando nós falamos em performance.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Antes de falar de Box e unboxing é importante saber um pouco sobre a arquitetura e os tipos de dados dentro do .NET…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/decB3Cu6GL5SVlFYoyJvgJz3LL2dmrGShtu2yytEPRxYwbojuiIhoJYxHOoG106wY21BsIh0vQymQf00ejL0N7yKCRquKkfO/001.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:156533</feedburner:origLink></item><item><title>Integração do TFS 2010 com o Project Server 2010</title><link>http://feedproxy.google.com/~r/devbrasil/~3/FuQdPKcCtKY/2307362:BlogPost:156297</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Rogério Rodrigues</dc:creator><pubDate>Sat, 17 Dec 2011 06:31:47 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-17:2307362:BlogPost:156297</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><span style="font-family: verdana, geneva;">O Team Foundation Server 2010 é a melhor ferramenta de ALM hoje no mercado. Dentre os diversos recuros que ela possui podemos destacar: Melhor controle no seu trabalho, podendo assim localizar rapidamente Work Itens e acompanhar tasks, Excelente e seguro controle de versão , gerenciamento e proteção de compilações.</span></p>
<p> </p>
<p><span style="font-family: verdana, geneva;">O Project Server 2010 funcionando sobre o Sharepoint Server 2010, entrega aos gerentes de projetos soluções flexíveis para acompanhar o status atualizado de cada projeto , bem como gerenciar a disponibilidade de recursos, tanto nas equipes que utilizam metodologia ágil como nas formais que trabalham no TFS.</span></p>
<p> </p>
<p>Essa integração permite sincronizar as informações dos itens de trabalho do TFS 2010 com as tarefas dos planos de projetos que estão armazenados no Project Server 2010. Dessa forma os Gerentes e o time de desenvolvimento podem usar os recursos que desejarem, ter as informações atualizadas com precisão e compartilhando as informações.</p>
<p> </p>
<p><span style="font-family: verdana, geneva;">Após os produtos serem devidamente configurados, o pacote de sincronização mantem todas as informações de planejamento e uso de recursos de acordo com o mapeamento feito entre os projetos do Project Server e os Team Projects do TFS 2010.</span></p>
<p> </p>
<p><span style="font-family: verdana, geneva;">Irei abordar principais praticas para fazer a integração do TFS 2010 com o Project Server, porém ,antes de mais nada, para ativar essa troca de informações entre os produtos, tenha instalado e configurado na seu servidor o Sharepoint Server, Project Server 2007 com SP2 ou o Project Server 2010 e o Team Foundation Server 2010. Os Gerentes e o time de desenvolvimento deverão ter em seus computadores instalados o Office Project Professional 2007 ou 2010, o Visual Studio 2010 com o SP1 e principalmente implantar o Active Directory.</span></p>
<p> </p>
<p><span style="text-decoration: underline;" class="font-size-4"><strong><span style="color: #333399; font-family: verdana, geneva; text-decoration: underline;">Etapas executadas pelo Administrador</span></strong></span></p>
<p><span style="text-decoration: underline;" class="font-size-4"><strong><span style="color: #333399; font-family: verdana, geneva; text-decoration: underline;"><br/></span></strong></span></p>
<p><span style="color: #0000ff; font-family: verdana, geneva;" class="font-size-3"><strong><em>Instalação</em></strong></span></p>
<p><span style="color: #0000ff; font-family: verdana, geneva;" class="font-size-3"><strong><em><br/></em></strong></span></p>
<p><span style="font-family: verdana, geneva;">Iremos ver agora o que é necessário instalar para fazer a integração:</span></p>
<p> </p>
<ul>
<li><span style="font-family: verdana, geneva;">Instalar o SP 1 para o TFS 2010, em cada computador que tiver o App Tier  e que vai participar da integração</span></li>
<li><span style="font-family: verdana, geneva;">Instalar o Feature Pack para Integração do Project Server com o TFS, em cada servidor que tiver o Project Server instalado e que iria participar da integração.</span></li>
<li><span style="font-family: verdana, geneva;">Instalar o SP1 do Visual Studio 2010 em cada máquina cliente que tiver o Visual Studio 2010 ou o Team Explorer instalado.</span></li>
</ul>
<p><span style="font-family: verdana, geneva;"><br/></span></p>
<p><strong><span style="text-decoration: underline;"><span style="font-family: verdana, geneva;">Permissões</span></span></strong></p>
<p><strong><span style="text-decoration: underline;"><span style="font-family: verdana, geneva;"><br/></span></span></strong></p>
<p><span style="font-family: verdana, geneva;">Para executar os procedimentos da integração você deve pertencer aos seguintes grupos e possuir as seguintes permissões:</span></p>
<p><span style="font-family: verdana, geneva;"><br/></span></p>
<ul>
<li><span style="font-family: verdana, geneva;">A conta que irá configurar a integração deverá ser adicionada ao grupo de administradores do TFS 2010.</span></li>
<li><span style="font-family: verdana, geneva;">Adicionar ao grupo com permissões para  fazer o gerenciamento dos <strong>Enterprise Project</strong> e os <strong>Team Projects</strong> para que consiga fazer o mapeamento entre os mesmos.</span></li>
<li><span style="font-family: verdana, geneva;">Atribuir permissões administrativas para as instâncias do PWA, possibilitando assim, o registro das instancias do PWA com as instancias do TFS 2010.</span></li>
<li><span style="font-family: verdana, geneva;">Caso esteja usando o Project Server 2007 você deve atribuir permissão total ao <strong>Shared Services Provider</strong> (SSP)</span></li>
<li><span style="font-family: verdana, geneva;">Caso esteja usando o Project Server 2010 você deve atribuir controle total ao usuário para que tenha permissões suficiente para invocar o <strong>Service Aplication do Project Server</strong>. Além disso você precisa conceder ao usuário permissão ao pool de aplicativos do <strong>PWA Reporting database</strong> , para alterar qualquer schema, criar tabelas, excluir, executar, inserir, selecionar e atualizar.</span></li>
<li><span style="font-family: verdana, geneva;">Deve conceder aos membros do Team Project do TFS ao grupo de acesso do PWA, para que ao menos consiga abrir o projeto e visualizar o site no Sharepoint.</span></li>
<li><span style="font-family: verdana, geneva;">Inserir os usuários do Office Project no grupo de <strong>Readers</strong> do Team Project ou conceder a eles <strong>View Project – Level Information</strong>, para que possam ter acesso e atualizar os planos de projeto no TFS.</span></li>
</ul>
<p><span style="font-family: verdana, geneva;"><br/></span></p>
<p><span class="font-size-3"><strong><em><span style="font-family: verdana, geneva; color: #0000ff;">Configuração da integração</span></em></strong></span></p>
<p><span style="font-family: verdana, geneva;"><br/></span></p>
<p>A seguir iriei informar um resumo dos procedimentos a serem efetuados para que a integração entre os dois produtos ocorra perfeitamente. Cada etapa usa TFSAdmin, ferramenta de linha de comando. Você irá encontrar essa ferramenta em um computador que esteja com o SP1 do Visual Studio instalado.</p>
<p> </p>
<p>Para conseguir executar os comandos é necessário que execute esse prompt como Administrador, clicando com o botão direito.</p>
<p> </p>
<p><strong><span style="text-decoration: underline;">Registrar Instância do PWA com TFS:</span></strong></p>
<p> </p>
<p>1. devemos registrar a instância do PWA com a APP Tier do TFS que armazena os Team Projects. Para isso devemos usar o comando abaixo:</p>
<p> </p>
<blockquote><p><i>TfsAdmin ProjectServer /RegisterPWA /pwa:pwaUrl /tfs:tfsUrl</i></p>
</blockquote>
<p><i><br/></i></p>
<p>Troque pwaUrl pela url da instância do seu PWA e o tfsUrl pela url do servidor que é usada para conectar o Team Explorer ao TFS, como no exemplo abaixo:</p>
<p> </p>
<p><strong>TfsAdmin ProjectServer /RegisterPWA /pwa:http://PWAServerName/PWAInstance /tfs:http://AdventureWorksServer:8080/tfs/</strong></p>
<p><strong><br/></strong></p>
<p>2. Mapear a instância do PWA com uma Collection:</p>
<p> </p>
<blockquote><p><i>TfsAdmin ProjectServer /MapPWAtoCollection /pwa:pwaUrl /collection:tpcUrl</i><i> </i></p>
<p><i><br/></i></p>
</blockquote>
<p>Troque o tcpUrl para a URL da Collection em questão, como no exemplo abaixo:</p>
<p> </p>
<p><strong>TfsAdmin ProjectServer /MapPWAToCollection /pwa:http://PWAServerName/PWAInstance /collection:http://AdventureWorksServer:8080/tfs/Collection0</strong></p>
<p><strong><br/></strong></p>
<p>3. Atualizar o mapeamento dos campos para cada Project collection que você tiver mapeado com uma instância do PWA:</p>
<p> </p>
<blockquote><pre><i>TfsAdmin ProjectServer /UploadFieldMappings /collection:tpcUrl /useDefaultFieldMappings</i></pre>
</blockquote>
<p> </p>
<p>Troque tcpURL pela url da Collection em questão, como no exemplo abaixo:</p>
<p> </p>
<p><strong>TfsAdmin ProjectServer /UploadFieldMappings /collection:http://AdventureWorksServer:8080/tfs/Collection0 /useDefaultFieldMappings</strong></p>
<p><strong><br/></strong></p>
<p>4.  Você deve associar um Plano de Projeto Coorporativo ou Enterprise Project Plan a um Team Project, esse Plano de Projejo já deve estar publicado no Project Server e o Team Project criado na determinada collection que já foi mapeada anteriormente. Nessa etapa também você deve listar os Work Itens que você deseja deixar sincronizado entre o Project Server e o TFS:</p>
<p> </p>
<blockquote><pre><i>TfsAdmin ProjectServer /MapPlanToTeamProject /collection:tpcUrl /enterpriseproject:PlanName /teamproject:ProjectName /workitemtypes:ListOfTypes</i></pre>
</blockquote>
<p> </p>
<p>Troque a tcpUrl pela URL da collection que esta sendo mapeada, o PlanName pelo nome do Enterprise Project que já esta hospedado no Project Server e já foi mapeado, o ProjectName pelo nome do Team Project criado na collecion e ListOfTypes pelos work itens que você deseja sincronizar, por exemplo se estiver usando um template agile , “User Storie, Task, Bugs”, sem espaços depois da vírgula como no exemplo abaixo:</p>
<p> </p>
<p><strong>TfsAdmin ProjectServer /MapPlanToTeamProject /collection:http://AdventureWorksServer:8080/tfs/Collection0/ enterpriseproject:MyEnterpriseProjA /teamproject:MyTeamProjB /workitemtypes:"User Story,Task"</strong></p>
<p><strong><br/></strong></p>
<p>5. Adicionar os membros do Team Project ao pool de recursos do plano de projeto coorporativo mapeado, para que consiga sincronizar os work itens atribuidos a cada membro do Team Project com as tarefas do Enterprise Project .</p>
<p> </p>
<p><span style="text-decoration: underline; font-family: verdana, geneva; color: #333399;" class="font-size-4"><strong>Etapas executadas pelo  Gerente e o Líder da equipe</strong></span></p>
<p> </p>
<p> </p>
<p>Verificar a Sincronização dos dados é uma etapa crucial para que a integração do Project Server com o TFS tenha sucesso. Execute as etapas a seguir no Enterprise Project e no Team Project que você mapeou.</p>
<p> </p>
<ol>
<li> Adicione uma tarefa no cronograma e coloque para sincronizar com o Team Project do TFS, definindo nome do recurso,o team Project e o work item, em seguida publique no Project server.</li>
<li>No Team explorer verfique a lista de pendências do projeto. Os novos work itens devem aparecer. Abra um work item e verifique em seu histórico se exibe a mensagem de sincronização com o Project Server.</li>
<li> Altere um dos Work Itens que foi replicado pelo Project Serve para o TFS. Vá na aba Project Server e modifique o item. Em seguida crie um novo item e selecione a opção Submit To Project Server e confirme para salvar o novo Work Item.</li>
<li>No navegador, abra o PWA  e entre no <strong>Approval Center</strong>, para verificar o Work Item que você alterou e o novo que acabou de ser criado. Aceite a atualização do status e adicione um comentário a ele.</li>
<li>Abra o Enterprise Project Plan e verifique se aparece os Work Itens aprovados.</li>
<li>No Team Explorer atualize o Team explorer , abra os Work Itens que foram sincronizados com o Project Server e verifique as mensagens no histórico. Entre na aba Project Server e verifique se as atualizações que você aprovou no Project Server estão corretas, existe um tempo aproximado de 1 a 3 minutos para que essas atualizações apareçam.</li>
</ol>
<p> </p>
<p>Caso essas tarefas sejam executadas com sem erros , então processo de sincronização foi concluído com êxito.</p>
<p> </p>
<p>Nesse artigo vimos que o processo de integração exige muito planejamento, atenção e paciência, para que no final tenhamos duas ferramentas muito poderosas em perfeita sincronia de dados e de forma transparente, conseguindo assim uma excelente plataforma para o gerenciamento de projetos.</p>
<p> </p>
<p><strong>Para saber mais:</strong></p>
<p><strong><a href="http://devbrasil.net/group/alm" target="_self">Aprofunde seus conhecimentos na comunidade ALM DevBrasil</a></strong></p>
<p><strong><a href="http://social.msdn.microsoft.com/Forums/en-US/tfsprojectsrvint" target="_blank">Fórum Team Foundation Server and Project Server Integration</a></strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/gg412642.aspx" target="_blank">Configuration Quick Reference</a></strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/gg412647.aspx" target="_blank">Configuring the Integration of Team Foundation Server and Project Server</a></strong></p>
<p><strong><a href="http://msdn.microsoft.com/en-us/library/gg412653.aspx" target="_blank">Assigning Permissions to Support Integration of Project Server and Team Foundation Server</a></strong></p>
<p><strong><br/></strong></p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/FuQdPKcCtKY" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;span style="font-family: verdana, geneva;"&gt;O Team Foundation Server 2010 é a melhor ferramenta de ALM hoje no mercado. Dentre os diversos recuros que ela possui podemos destacar: Melhor controle no seu trabalho, podendo assim localizar rapidamente Work Itens e acompanhar tasks, Excelente e seguro controle de versão , gerenciamento e proteção de compilações.&lt;/span&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: verdana, geneva;"&gt;O Project Server 2010 funcionando sobre o Sharepoint Server 2010,…&lt;/span&gt;&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:156297</feedburner:origLink></item><item><title>Como ser um desenvolvedor melhor</title><link>http://feedproxy.google.com/~r/devbrasil/~3/xzwRHjkIgvU/2307362:BlogPost:156023</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ray Silva</dc:creator><pubDate>Thu, 15 Dec 2011 09:00:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-15:2307362:BlogPost:156023</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Certa vez lí um artigo no blog do <a href="http://dreamdotnet.blogspot.com/2008/02/how-to-be-better-developer.html" target="_blank">Arnaud Weil</a> (em inglês) que me chamou a atenção em uma questão que já é discutida há muito tempo e trás uma abordagem muito interessante quando nos perguntamos: Eu sou um bom desenvolvedor? Será que a forma que estou desenvolvendo os meus projetos e entregando soluções ao meu cliente é a melhor? O que eu posso fazer para que o meu aprendizado seja contínuo e esteja atendendo as demandas do mercado? Possivelmente todos nós já pensamos isso.</p>
<p> </p>
<p>Vou colocar aqui alguns pontos de vista que não são somente de autoria minha mas que possam ser debatidos por todos nós. O intuito não é orientar tecnicamente a comunidade mas sim deixar a questão em aberto para que você dê o seu ponto sobre o assunto!</p>
<h2><span style="color: #99cc00;">Conheça bem o seu framework!</span></h2>
<p> </p>
<p>É muito comum ver desenvolvedores muito experientes vindo de outras tecnologias querendo reescrever classes já existentes ou criando alternativas desnecessárias para resolver o mesmo problema.</p>
<p> </p>
<p>O framework está pronto, usufrua dele e saiba como trabalhar e aproveitar o melhor que ele tem a oferecer!</p>
<p> </p>
<h2><span style="color: #99cc00;">Melhore a roda, não invente.</span></h2>
<p> </p>
<p>Existem diversos tipos de solução para o mesmo problema, mas que tal seguir um padrão? Aprenda Design Patterns! Saiba o que é melhor para cada situação, o que é melhor para o seu projeto e como você pode entregar melhor um projeto!</p>
<p> </p>
<p>Padronizando e utilizando melhores práticas, você facilita a sua vida e da sua equipe.</p>
<p> </p>
<h2><span style="color: #99cc00;">Escreva artigos técnicos, faça video-aulas, participe de uma comunidade técnica!</span></h2>
<p> </p>
<p>Ensinar é uma forma muito válida de aprender! Ao ensinar, você precisa saber o que está falando e dessa forma "se obriga" a estudar.</p>
<p> </p>
<p>Iniciar seu próprio blog, escrever artigos e compartilhar é a melhor maneira de você mostrar o que você sabe, errar, aprender e no fim de tudo continuar evoluindo.</p>
<p> </p>
<p>Uma longa jornada começa com o primeiro passo!</p>
<p> </p>
<h2><span style="color: #99cc00;">Faça apresentação / palestras</span></h2>
<p><span><br/></span></p>
<p><span>Fazendo uma apresentação ou palestra é outra forma de força o seu conhecimento a evoluir sobre um determinado assunto. </span></p>
<p><span><br/></span></p>
<p><span>Você pode começar a fazer apresentações para poucos amigos, na sua empresa, não importa! Hoje o profissional que capacita pessoas é o profissional que mais é procurado no mercado. </span></p>
<p><span><br/></span></p>
<p><span>Seja o diferencial!</span></p>
<p><span><br/></span></p>
<h2><span style="color: #99cc00;">Escreva código com qualidade</span></h2>
<p><span><br/></span></p>
<p><span>Se você é apto para fazer algo da melhor maneira possível, faça da melhor maneira possível!</span></p>
<p> </p>
<p>Existe uma enorme quantidade de material sobre boas práticas, leia, aprimore-se e evite a "gambiarra".</p>
<p> </p>
<h2><span style="color: #99cc00;">Qualidade importa, teste seu código!</span></h2>
<p><span><br/></span></p>
<p><span>Não importa se você usa TDD (Test Driven Development Unit Testing) ou Plain Old Unit testing, certifique-se que o seu software tem qualidade!</span></p>
<p><span><br/></span></p>
<p><span>Os testes unitários são uma forma incrível de garantir que os bugs passem longe do seu produto! É muito bom que você encontre os bugs, não os usuários.</span></p>
<p><span><br/></span></p>
<p><span>E você? O que adicionaria a essa lista?</span></p>
<p><span><br/></span></p>
<p><strong>Para saber mais:</strong></p>
<p><a href="http://devbrasil.net/group/alm" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ALM</a></p>
<p><a href="http://devbrasil.net/profiles/blogs/como-participar-da-comunidade" target="_self">Como participar da comunidade publicando artigos</a> </p>
<p><a href="http://www.brasport.com.br/index.php?dispatch=products.view&amp;product_id=593" target="_blank">Sugestão de livro sobre o Gerenciamento de Projetos de Softwre</a></p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/xzwRHjkIgvU" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Certa vez lí um artigo no blog do &lt;a href="http://dreamdotnet.blogspot.com/2008/02/how-to-be-better-developer.html" target="_blank"&gt;Arnaud Weil&lt;/a&gt; (em inglês) que me chamou a atenção em uma questão que já é discutida há muito tempo e trás uma abordagem muito interessante quando nos perguntamos: Eu sou um bom desenvolvedor? Será que a forma que estou desenvolvendo os meus projetos e entregando soluções ao meu cliente é a melhor? O que eu posso fazer para que o meu aprendizado seja contínuo e…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:156023</feedburner:origLink></item><item><title>Introdução ao WCF (Windows Communication Foundation)</title><link>http://feedproxy.google.com/~r/devbrasil/~3/LFcGPnfhrhM/2307362:BlogPost:156164</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ray Silva</dc:creator><pubDate>Thu, 15 Dec 2011 06:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-15:2307362:BlogPost:156164</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Sem dúvidas os Web Services tiveram uma aceitação global no desenvolvimento de aplicações orientadas a serviços (SOA).</p>
<p> </p>
<p>Os Web Services constam atualmente com diversos recursos, tais como coordenação de transações distribuídas, comunicação segura e o mais importante, segurança.<br/></p>
<p>O Windows Communication Foundation (WCF) é uma parte do .NET Framework que fornece um modelo de programação unificado para criar rapidamente aplicativos orientados a serviços que se comunicam pela Web e por toda a empresa.</p>
<p> </p>
<p>O WCF foi desenvolvido para oferecer ampla interoperabilidade baseada no modelo de computação distribuída e no suporte direto à orientação a objetos.</p>
<p> </p>
<p>Com o Visual Studio 2010 temos ferramentas que nos possibilitam construir aplicações distribuídas utilizando WCF.</p>
<p> </p>
<p><a href="http://api.ning.com:80/files/02qSj2SkUEHPmexO4nYSVj*XnI4CdBdhqK59TqEuMV*sEzsgqKDTaL-M*u2qLzQR4mWMpgmtoUvPfYvkvdlZTEb0mP7i3PQ6/wcf001.jpg" target="_self"><img src="http://api.ning.com:80/files/02qSj2SkUEHPmexO4nYSVj*XnI4CdBdhqK59TqEuMV*sEzsgqKDTaL-M*u2qLzQR4mWMpgmtoUvPfYvkvdlZTEb0mP7i3PQ6/wcf001.jpg?width=750" width="750" class="align-center"/></a></p>
<p style="text-align: center;"><span class="font-size-1">Figura 1 -WCF no Visual Studio 2010</span></p>
<p>No .NET Framework 4, foram feitas melhorias significativas nos namespaces do Windows Communication Foundation (WCF) 4.</p>
<p> </p>
<p>Os desenvolvedores do .NET podem usar essas tecnologias, seja de forma independente ou em conjunto, para não precisar abrir mão da facilidade de criação dos serviços nem dos serviços escaláveis de alto desempenho.</p>
<p> </p>
<p>A seguir, um breve descritivo sobre:</p>
<p> </p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>Serviços</strong></span></p>
<p> </p>
<p>Os serviços são partes de código do sistema, os quais podem ser consumidos por uma aplicação cliente que por sua vez pode estar em qualquer ambiente e sistema operacional.</p>
<p> </p>
<p>O serviço WCF se baseia em uma interface que define um contrato entre serviço e um cliente, o mesmo ficando marcado como <strong>[ServiceContract]</strong>.</p>
<p> </p>
<p>Os métodos são expostos por meio do atributo <strong>[OperationContract]</strong>.</p>
<p> </p>
<p><span style="color: #99cc00;"><strong><span class="font-size-3">Atributo [ServiceContract]</span></strong></span></p>
<p> </p>
<p>Esse atributo nos permite definir um contrato de serviço e pode ser aplicado a uma classe ou interface.</p>
<p> </p>
<p>Na realidade, ele mapeia uma interface do Common Language Runtime (CLR) para uma tecnologia de contrato de serviço neutra. </p>
<p> </p>
<p>Tenha em mente que sem esse atributo, a classe não será visível para os clientes do serviço.</p>
<p> </p>
<p><span class="font-size-3"><strong><span style="color: #99cc00;">Atributo [OperationContract]</span></strong></span></p>
<p> </p>
<p>Os métodos que serão publicados com o WCF precisam desse atributo, o qual pode ser configurado com propriedades a seguir:</p>
<p> </p>
<p><strong>Action:</strong></p>
<p>Obtém ou define o WS-Addressing da mensagem solicitada</p>
<p><strong>AsyncPattern:</strong></p>
<p>Este atributo indica que a operação é implementada de forma assíncrona usando métodos Begin/End no serviço.</p>
<p><strong>IsInitiating:</strong><br/> Indica que a operação pode ser inicial no serviço.</p>
<p><strong>IsOneWay:</strong></p>
<p>Indica que a operação consiste somente em uma única mensagem de entrada.</p>
<p><strong>IsTerminating:</strong></p>
<p>Indica que o runtime deve tentar encerrar a sessão atual após a operação ser concluída </p>
<p> </p>
<p><span class="font-size-3" style="color: #99cc00;"><strong>Atributo [DataContract]</strong></span></p>
<p> </p>
<p>Este atributo é um acordo entre o cliente e o serviço que descreve os dados que serão trocados, ou seja, um contrato que define para cada parâmetro ou tipo de retorno, qual dado será serializado para ser transferido.</p>
<p> </p>
<p>Serializar o objeto significa converter o objeto para um formato XML ou binário para possa ser transferido.</p>
<p> </p>
<p><span style="color: #99cc00;" class="font-size-3"><strong>Atributo [DataMember]</strong></span></p>
<p> </p>
<p>Este atributo indica que o membro de uma classe fará parte do contrato de dados, fazendo com que esse membro seja serializado e fique disponível ao cliente do serviço.</p>
<p> </p>
<p style="text-align: center;">Se tivermos a intenção de controlar como esse atributo será serializado, basta utilizar a propriedade <strong>Name</strong> do atributo [DataMember], exemplo:<br/> <br/> <span style="font-family: terminal, monaco;"><em>[DataMember(Name = "nome")]</em></span></p>
<p style="text-align: center;"><span style="font-family: terminal, monaco;"><em>public string nome;</em></span></p>
<p> </p>
<p><span style="color: #99cc00;" class="font-size-3"><strong>Alguns dos recursos do WCF:</strong></span></p>
<p>Além de ser baseado nos princípios de SOA, o WCF ainda conta com vários recursos interessantes:</p>
<p> </p>
<p>- Modelo de segurança integrado</p>
<p>- Suporte a gerenciamento de estado utilizando Sessions</p>
<p>- Interoperabilidade e integração com muitas APIs</p>
<p>- Contadores de desempenho, suporte a comunicação transacional</p>
<p>Nesse artigo, pudemos analisar o quão importante é estar a par de novas tecnologias e o quanto uma tecnologia como o WCF pode nos auxiliar no sentido de interoperabilidade.</p>
<p>A idéia de que vários clientes em diversos ambientes usufruam do mesmo serviço é essencial para qualquer projeto de Software hoje em dia.</p>
<p> </p>
<p><strong><span style="color: #99cc00;">Para saber mais:</span><br/></strong> <a rel="nofollow" href="http://devbrasil.net/group/aspnet" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a><br/> <a href="http://msdn.microsoft.com/library/dd943056.aspx" target="_blank">Aprofunde seus conhecimentos sobre WCF</a><br/> <a href="http://msdn.microsoft.com/pt-br/netframework/dd939784" target="_blank">Guia para Iniciantes do Windows Communication Foundation</a><br/> <a href="http://pt.wikipedia.org/wiki/Common_Language_Runtime" target="_blank">Aprofunde seus conhecimentos sobre CLR</a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/LFcGPnfhrhM" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Sem dúvidas os Web Services tiveram uma aceitação global no desenvolvimento de aplicações orientadas a serviços (SOA).&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Os Web Services constam atualmente com diversos recursos, tais como coordenação de transações distribuídas, comunicação segura e o mais importante, segurança.&lt;br&gt;&lt;/br&gt;&lt;/p&gt;
&lt;p&gt;O Windows Communication Foundation (WCF) é uma parte do .NET Framework que fornece um modelo de programação unificado para criar rapidamente aplicativos orientados a serviços que se…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/02qSj2SkUEHPmexO4nYSVj*XnI4CdBdhqK59TqEuMV*sEzsgqKDTaL-M*u2qLzQR4mWMpgmtoUvPfYvkvdlZTEb0mP7i3PQ6/wcf001.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:156164</feedburner:origLink></item><item><title>Acesso a dados com ADO.NET</title><link>http://feedproxy.google.com/~r/devbrasil/~3/kN4YTzHd0pg/2307362:BlogPost:154129</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ray Silva</dc:creator><pubDate>Wed, 14 Dec 2011 10:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-14:2307362:BlogPost:154129</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>O ADO.NET (ou tecnologia ActiveX Data Objects) consiste num conjunto de classes definidas pelo .NET framework que pode ser utilizado para acessar os dados armazenados numa base de dados local ou remota.<br/> <br/> Para que seja possível executar um comando SQL ou se conectar a um banco de dados, existem classes contidas em namespaces do .NET Framework.<br/> <br/> Alguns namespaces comuns e seus conteúdos são:<br/> <br/> <b>System.Data:</b> Contém classes independentes de banco de dados, tais como <b>DataSet</b> e <b>DataTable</b> que podem ser utilizadas por qualquer banco de dados.<br/> <br/> <b>System.Data.Common:</b> Contém classes para conectar em um banco de dados utilizando a tecnologia OLE DB.<br/> <br/> <b>System.Data.ODBC:</b> Contém classes para conectar em um banco de dados utilizando um driver ODBC.<br/> <br/> <b>System.Data.SqlClient:</b> Contém classes para conectar ao banco de dados SQL Server a partir da versão 7.0. Para conectar em versões anteriores, podemos utilizar as classes contidas no namespace</p>
<p>System.Data.OleDB.<br/> <br/> <b>System.Data.OracleClient:</b> Contém classes para conectar em um banco de dados Oracle.<br/> <br/> Quando acessamos um banco de dados, precisamos de algumas classes que nos auxiliam a executar tarefas, tais como conectar, ler e executar comandos.<br/> <br/> Para cada banco de dados temos uma classe diferente:</p>
<table border="1" cellspacing="0">
<tbody><tr><td valign="top" width="115"><p align="center"><b>Tipo de Objeto</b></p>
</td>
<td valign="top" width="115"><p align="center"><b>SQL Server</b></p>
</td>
<td valign="top" width="115"><p align="center"><b>Oracle</b></p>
</td>
<td valign="top" width="115"><p align="center"><b>OLE DB</b></p>
</td>
<td valign="top" width="115"><p align="center"><b>ODBC</b></p>
</td>
</tr>
<tr><td valign="top" width="115"><p><b>Conexão</b></p>
</td>
<td valign="top" width="115"><p><i>SqlConnection</i></p>
</td>
<td valign="top" width="115"><p><i>OracleConnection</i></p>
</td>
<td valign="top" width="115"><p><i>OleDbConnection</i></p>
</td>
<td valign="top" width="115"><p><i>OdbcConnection</i></p>
</td>
</tr>
<tr><td valign="top" width="115"><p><b>Comando</b></p>
</td>
<td valign="top" width="115"><p><i>SqlCommand</i></p>
</td>
<td valign="top" width="115"><p><i>OracleCommand</i></p>
</td>
<td valign="top" width="115"><p><i>OleDbCommand</i></p>
</td>
<td valign="top" width="115"><p><i>OdbcCommand</i></p>
</td>
</tr>
<tr><td valign="top" width="115"><p><b>Leitor</b></p>
</td>
<td valign="top" width="115"><p><i>SqlDataReader</i></p>
</td>
<td valign="top" width="115"><p><i>OracleDataReader</i></p>
</td>
<td valign="top" width="115"><p><i>OleDbDataReader</i></p>
</td>
<td valign="top" width="115"><p><i>OdbcDataReader</i></p>
</td>
</tr>
<tr><td valign="top" width="115"><p><b>Adaptador</b></p>
</td>
<td valign="top" width="115"><p><i>SqlDataAdpter</i></p>
</td>
<td valign="top" width="115"><p><i>OracleDataAdapter</i></p>
</td>
<td valign="top" width="115"><p><i>OleDbDataAdapter</i></p>
</td>
<td valign="top" width="115"><p><i>OdbcDataAdapter</i></p>
</td>
</tr>
</tbody>
</table>
<p>Os nomes dos objetos são bem similares e diferem-se pelas iniciais, facilitando o aprendizado do ADO.NET.<br/> <br/> Caso seja necessário utilizar um provedor de dados que não seja nativo no .NET Framework, podemos utilizar um provedor de terceiro. Alguns provedores são pagos. Podemos obter um provedor diferente diretamente com o fabricante do banco de dados ou utilizar um provedor de terceiro.<br/> <br/> <b style="font-size: 16px;">Classes do ADO.NET<br/> <br/></b> Veremos algumas das classes mais utilizadas e alguns detalhes de sua utilização.<br/> <br/> <span style="color: #99cc00;"><strong><span class="font-size-3"><u style="font-size: 16px;">SqlConnection</u></span></strong></span></p>
<p> </p>
<p>Essa classe é responsável pela conexão com a base de dados. Veja algumas propriedades e métodos mais importantes que serão utilizados frequentemente em nossos projetos.</p>
<table border="1" cellspacing="0">
<tbody><tr><td valign="top" width="288"><p align="center"><b>Propriedade</b></p>
</td>
<td valign="top" width="288"><p align="center"><b>Descrição</b></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>ConnectionString</b></p>
</td>
<td valign="top" width="288"><p>String contendo caminho do banco de dados</p>
</td>
</tr>
</tbody>
</table>
<p></p>
<table border="1" cellspacing="0">
<tbody><tr><td valign="top" width="288"><p align="center"><b>Método</b></p>
</td>
<td valign="top" width="288"><p align="center"><b>Descrição</b></p>
</td>
</tr>
<tr><td valign="top" width="288"><p>Open()</p>
</td>
<td valign="top" width="288"><p>Abre a conexão com o banco de dados</p>
</td>
</tr>
<tr><td valign="top" width="288"><p>Close()</p>
</td>
<td valign="top" width="288"><p>Fecha a conexão com o banco de dados</p>
</td>
</tr>
</tbody>
</table>
<p>A propriedade <b>ConnectionString</b> do objeto de conexão pode ser configurada com a ajuda do Visual Studio ou manualmente, sendo assim, é muito importante entender a utilidade de alguns de seus atributos:</p>
<table border="1" cellspacing="0">
<tbody><tr><td valign="top" width="288"><p align="center"><b>Atributo</b></p>
</td>
<td valign="top" width="288"><p align="center"><b>Descrição</b></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Provider</b></p>
</td>
<td valign="top" width="288"><p><i>Quando utilizamos objetos do provedor OLE DB atribuímos o provider apropriado</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>InitialCatalog</b></p>
</td>
<td valign="top" width="288"><p><i>Nome do banco de dados inicial</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Database</b></p>
</td>
<td valign="top" width="288"><p><i>Nome do banco de dados</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>User ID</b></p>
</td>
<td valign="top" width="288"><p><i>Usuário que tenha acesso ao banco de dados</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Password</b></p>
</td>
<td valign="top" width="288"><p><i>Senha de um usuário que tenha acesso ao banco de dados</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>DataSource</b></p>
</td>
<td valign="top" width="288"><p><i>Nome do arquivo de banco de dados ou endereço do servidor de banco de dados</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Server</b></p>
</td>
<td valign="top" width="288"><p><i>Endereço do servidor de banco de dados</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Persist Security Info</b></p>
</td>
<td valign="top" width="288"><p><i>É recomendável utilizar como false, pois quando a conexão estiver aberta, não são retornados dados como password. Os valores aceitos são true, false, yes ou no.</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Integrated Security</b></p>
</td>
<td valign="top" width="288"><p><i>Segurança integrada com o Windows. Os valores aceitos são true, false e SSPI, que é o mesmo que true.</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Trusted Connection</b></p>
</td>
<td valign="top" width="288"><p><i>Segurança integrada com Windows. Os valores aceitos são true, false, SSPI, que é o mesmo que true.</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Connection Timeout</b></p>
</td>
<td valign="top" width="288"><p><i>Tempo (em segundos) que deve ser aguardado para que a conexão seja efetuada. O tempo padrão é de 15 segundos.</i></p>
</td>
</tr>
<tr><td valign="top" width="288"><p><b>Encrypt</b></p>
</td>
<td valign="top" width="288"><p><i>Se ativada esta opção, o banco de dados usa encriptação SSL para todos os dados enviados entre o cliente e o servidor. Os valores válidos para este atributo são yes, no, true, false ou SSPI (o mesmo que true)</i></p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p><span class="font-size-3"><strong><span style="color: #99cc00;"><u>SqlCommand</u></span></strong></span></p>
<p><u><br/></u></p>
<p>Essa classe é responsável por enviar um comando ao banco de dados, porém, para utilizar um comando é necessário um objeto de conexão propriamente configurado.</p>
<p> </p>
<p>Veja a tabela com as propriedades e métodos mais utilizados:</p>
<p> </p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top"><p style="text-align: center;"><strong>Propriedade</strong></p>
</td>
<td width="288" valign="top"><p style="text-align: center;"><strong>Descrição</strong></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>Connection</p>
</td>
<td width="288" valign="top"><p>Atribuiremos um objeto de conexão SqlConnection configurado</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>CommandText</p>
</td>
<td width="288" valign="top"><p>Comando SQL que será executado no banco de dados</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>CommandType</p>
</td>
<td width="288" valign="top"><p>Enumerador que indica que tipo de CommandText iremos executar</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>Parameters</p>
</td>
<td width="288" valign="top"><p>Coleção de objetos da classe SqlParameter que pode ou não existir</p>
</td>
</tr>
</tbody>
</table>
<p></p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top"><p style="text-align: center;"><strong>Método</strong></p>
</td>
<td width="288" valign="top"><p style="text-align: center;"><strong>Descrição</strong></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>ExecuteNonQuery()</p>
</td>
<td width="288" valign="top"><p>Executa um comando que não precisa retornar dados (Insert, delete, Update ou qualquer DDL, DCL ou DML).</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>ExecuteReader()</p>
</td>
<td width="288" valign="top"><p>Executa um comando que retorna dados. O retorno deste método é um objeto SqlDataReader.</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>ExecuteScalar()</p>
</td>
<td width="288" valign="top"><p>Executa um comando e obtém um valor de retorno. Muito utilizando com funções como MAX, SUM,MIN, etc, por ter melhor desempenho que os outros tipos</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>ExecuteXmlReader()</p>
</td>
<td width="288" valign="top"><p>O mesmo que o ExecuteReader, mas o retorno deste método será um objeto XmlReader, utilizado para trabalhar com dados no formato XML.</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p><strong><span style="color: #99cc00;" class="font-size-3"><u>SqlDataReader</u></span></strong></p>
<p> </p>
<p>Este objeto funciona como um leitor de dados porque obtém o resultado de um comando quando executamos o método ExecuteReader() e nos permite a leitura destes dados através do método Read().</p>
<p> </p>
<p>Alguns métodos e propriedades importantes dessa classe:</p>
<p> </p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top"><p style="text-align: center;"><strong>Método</strong></p>
</td>
<td width="288" valign="top"><p style="text-align: center;"><strong>Descrição</strong></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>Read</p>
</td>
<td width="288" valign="top"><p>Este método retorna true quando avança em uma linha na tabela, o leitor consegue varrer a tabela utilizando o retorno do método ExecuteReader() do objeto SqlCommand. Quando terminamos a leitura dos dados, temos que fechar o leitor e a conexão.</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>IsDbNull</p>
</td>
<td width="288" valign="top"><p>Este método retorna true se o valor da coluna da linha atual é nula.</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>GetName</p>
</td>
<td width="288" valign="top"><p>Este método retorna o nome da coluna na posição especificada.</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>GetOrdinal</p>
</td>
<td width="288" valign="top"><p>Este método retorna o índice da coluna atribuindo o nome da coluna como parâmetro.</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>GetDate, GetDouble, GetInt32 e outros</p>
</td>
<td width="288" valign="top"><p>Retornam os dados da coluna já convertidos, evitando que façamos typecast nas conversões ou o uso da classe Convert.</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p><span style="color: #99cc00;"><strong><span class="font-size-3"><u>DataSet</u></span></strong></span></p>
<p><span style="color: #99cc00;"><strong><span class="font-size-3"><u><br/></u></span></strong></span></p>
<p>Um dos objetos mais poderosos da arquitetura ADO.NET é o DataSet, que contém uma coleção de DataTables, que podem estar relacionados por meio de objetos DataRelation.</p>
<p> </p>
<p>Podemos garantir a integridade dos dados de um DataSet com a ajuda dos objetos <strong>UniqueConstraint</strong> e <strong>ForeignConstraint</strong>, como se tivéssemos a estrutura de um banco de dados em memória.</p>
<p> </p>
<p>Podemos preencher um DataSet através do método Fill da classe SqlDataAdapter ou criar um objeto DataTable e adicioná-lo manualmente à coleção Tables do objeto DataSet.</p>
<p> </p>
<p>Ambos os objetos DataSet e DataTable estão contidos no namespace System.Data.</p>
<p> </p>
<p>Veja as classes mais utilizadas e uma breve descrição:</p>
<p> </p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top"><p align="center"><b>Tipo</b></p>
</td>
<td width="288" valign="top"><p align="center"><b>Descrição</b></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>DataSet</p>
</td>
<td width="288" valign="top"><p>Contém uma coleção de DataTables e DataRelations que podem ser utilizados em memória e enviados para o banco de dados quando houver alteração.</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>DataTable</p>
</td>
<td width="288" valign="top"><p>Representa uma tabela (linhas e colunas) que pode ou não estar contido em um DataSet</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>DataColumn</p>
</td>
<td width="288" valign="top"><p>Representa uma coluna em um DataTable</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>DataRow</p>
</td>
<td width="288" valign="top"><p>Representa uma linha em um DataTable</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>DataRelation</p>
</td>
<td width="288" valign="top"><p>Representa um objeto de relacionamento entre dois DataTables contidos em um DataSet que podem ser utilizados em construções de consultas Master-Detail, por exemplo (consultas em tabelas pai-filho).</p>
</td>
</tr>
</tbody>
</table>
<p><b><u><br/></u></b></p>
<p><span style="color: #99cc00;"><strong><span class="font-size-3"><u>SqlDataAdapter</u></span></strong></span></p>
<p> </p>
<p>A classe SqlDataAdapter é utilizada para preencher objetos DataSet ou DataTable e para enviar alterações nestes objetos para o banco de dados.</p>
<p> </p>
<p>É possível enviar as alterações ou receber os dados devido à quatro importantes propriedades que essa classe contém:</p>
<p> </p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top"><p align="center"><b>Propriedade</b></p>
</td>
<td width="288" valign="top"><p align="center"><b>Descrição</b></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>SelectCommand</p>
</td>
<td width="288" valign="top"><p>Contém um objeto do tipo SqlCommand com uma instrução para selecionar os dados no banco de dados</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>InsertCommand</p>
</td>
<td width="288" valign="top"><p>Contém um objeto do tipo SqlCommand com uma instrução para inserir os dados no banco de dados</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>DeleteCommand</p>
</td>
<td width="288" valign="top"><p>Contém um objeto do tipo SqlCommand com uma instrução para excluir os dados no banco de dados</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>UpdateCommand</p>
</td>
<td width="288" valign="top"><p>Contém um objeto do tipo SqlCommand com uma instrução para atualizar os dados no banco de dados</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>Entre os métodos mais importantes da classe SqlDataAdapter, podemos citar:</p>
<p> </p>
<table border="1" cellspacing="0">
<tbody><tr><td width="288" valign="top"><p align="center"><b>Método</b></p>
</td>
<td width="288" valign="top"><p align="center"><b>Descrição</b></p>
</td>
</tr>
<tr><td width="288" valign="top"><p>Fill</p>
</td>
<td width="288" valign="top"><p>Preenche um objeto DataSet ou DataTable executando o comando contido na propriedade SelectCommand</p>
</td>
</tr>
<tr><td width="288" valign="top"><p>Update</p>
</td>
<td width="288" valign="top"><p>Executa um comando específico para cada linha contida no DataTable ou DataSet enviado como parâmetro.</p>
</td>
</tr>
</tbody>
</table>
<p> </p>
<p>O artigo retratou uma parte das informações que podemos usufruir do ADO.NET. É muito importante compreender como podemos utilizar as classes já prontas no .NET Framework!</p>
<p><strong><br/></strong></p>
<p><strong>Para saber mais:</strong></p>
<p><b><a href="http://www.sqlsummit.com/DataProv.htm" target="_blank">ADO.NET Data Providers, Tools and Vendors</a><br/></b> <a href="../../group/aspnet" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a><br/> <a href="http://msdn.microsoft.com/pt-br/library/0d941h9d.aspx">Aprofunde seus conhecimentos sobre namespaces</a><br/> <a href="http://msdn.microsoft.com/en-us/library/h43ks021%28v=vs.71%29.aspx">Aprofunde seus conhecimentos sobre ADO.NET<br/></a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/kN4YTzHd0pg" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;O ADO.NET (ou tecnologia ActiveX Data Objects) consiste num conjunto de classes definidas pelo .NET framework que pode ser utilizado para acessar os dados armazenados numa base de dados local ou remota.&lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; Para que seja possível executar um comando SQL ou se conectar a um banco de dados, existem classes contidas em namespaces do .NET Framework.&lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; Alguns namespaces comuns e seus conteúdos são:&lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; &lt;b&gt;System.Data:&lt;/b&gt; Contém classes independentes de banco de dados, tais…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:154129</feedburner:origLink></item><item><title>Integração ASP.NET e Firebird</title><link>http://feedproxy.google.com/~r/devbrasil/~3/ScGeykDbujU/2307362:BlogPost:154010</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Ray Silva</dc:creator><pubDate>Wed, 14 Dec 2011 08:00:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-14:2307362:BlogPost:154010</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>O Firebird é um banco de dados relacional Open Source que oferece um padrão de SQL ANSI que roda em Windows e uma variedades de plataformas Unix-like, além de oferecer uma ótima concorrência de dados, alto desempenho e uma linguagem poderosa que suporta stored procedures, triggers, etc. O Firebird é usado em ambientes de produção desde 1981.</p>
<p><br/> Normalmente o SQL Server é eleito como banco de dados em um projeto ASP.NET devido às facilidades e integrações das tecnologias, contudo, existem escopos que exigem a integração de tecnologias diferentes em projetos de Software.<br/> Faremos um exemplo de aplicação em ASP.NET 4.0, C#, utilizando Visual Studio 2010.</p>
<p> </p>
<p>O primeiro passo é entender como uma aplicação fará o acesso aos dados e nesse artigo utilizaremos o ADO.NET.</p>
<p> </p>
<p>O ADO.NET (ou tecnologia ActiveX Data Objects) consiste num conjunto de classes definidas pelo .NET framework que pode ser utilizado para receber os dados armazenados numa base de dados local ou remota.</p>
<p> </p>
<p>Considerando que usaremos o Firebird, necessitamos fazer o download do Firebird .NET Provider, o mesmo está disponível no site do terceiro, nesse <a href="http://www.firebirdsql.org/en/net-provider/">link</a>.</p>
<p> </p>
<p align="center"><a target="_self" href="http://api.ning.com:80/files/xYAIqr5Cfo3bqTZ2A1W5m08UvQ6sZxo0sqoTEUyeHicxjebPBOqHzyBlhcbVrWhEZAyJ63l7q7cXv7innFLKmwC-e9D08hA0/001.jpg"><img class="align-center" src="http://api.ning.com:80/files/xYAIqr5Cfo3bqTZ2A1W5m08UvQ6sZxo0sqoTEUyeHicxjebPBOqHzyBlhcbVrWhEZAyJ63l7q7cXv7innFLKmwC-e9D08hA0/001.jpg" width="300"/></a><span class="font-size-1">Figura 1 – Baixando o Firebird .NET Provider<br/> <br/></span></p>
<p>Após fazer o download do arquivo, abra o Visual Studio 2010 e crie um novo projeto (File -&gt; New – Project).</p>
<p align="center"><a target="_self" href="http://api.ning.com:80/files/Z3e0beMI1KBFufwZl*rGbo7Axxs30b0yjDZHJ1VMMNyhHdrIpWEGG2wBDtl8gR5Og6-L3OgzIxT89cwN*j2UgF2bdVV6FPiv/002.jpg"><img class="align-center" src="http://api.ning.com:80/files/Z3e0beMI1KBFufwZl*rGbo7Axxs30b0yjDZHJ1VMMNyhHdrIpWEGG2wBDtl8gR5Og6-L3OgzIxT89cwN*j2UgF2bdVV6FPiv/002.jpg" width="300"/></a><span class="font-size-1">Figura 2 – Criando novo projeto<br/> <br/></span></p>
<p>Selecione ASP.NET Empty Web Application, .NET Framework 4 e dê um nome a aplicação.</p>
<p> </p>
<p>Agora que já temos a aplicação web criada, incluiremos as DLLs que baixamos do site do Firebird em nosso projeto:</p>
<p> </p>
<p align="center"><a target="_self" href="http://api.ning.com:80/files/EzW97n0q1C2H*Tm7DjBmY0QyxMDCKkIf4njvmYOcoa3K-nCsdXbaxyRb21vDAdG6wXDA7Jv1AfkCqO4VDNWVUXPGD3ciZrr9/003.jpg"><img class="align-center" src="http://api.ning.com:80/files/EzW97n0q1C2H*Tm7DjBmY0QyxMDCKkIf4njvmYOcoa3K-nCsdXbaxyRb21vDAdG6wXDA7Jv1AfkCqO4VDNWVUXPGD3ciZrr9/003.jpg" width="284"/></a><span class="font-size-1">Figura 3 – DLLs Firebird</span></p>
<p>Para incluir as DLLs em nosso projeto, clique no Solution Explorer e com o botão direito do mouse, selecione “Add Reference”.</p>
<p> </p>
<p align="center"><a target="_self" href="http://api.ning.com:80/files/xYAIqr5Cfo1RoVywiefauxhDruuXRYNtgtQzym3Vg2EY1LyJ0y*z7hlta5vahbTwjxloY9Q7sTYpZvQnLoszfA4CgEB0uuYu/004.jpg"><img class="align-center" src="http://api.ning.com:80/files/xYAIqr5Cfo1RoVywiefauxhDruuXRYNtgtQzym3Vg2EY1LyJ0y*z7hlta5vahbTwjxloY9Q7sTYpZvQnLoszfA4CgEB0uuYu/004.jpg" width="300"/></a><span class="font-size-1">Figura 4 – Add reference no projeto<br/> <br/></span></p>
<p>Clique em “Browse” e siga até a localização física da DLLs no seu computador.</p>
<p> </p>
<p>Repare que no seu Solution Explorer as DLLs já estarão referenciadas.</p>
<p> </p>
<p align="center"><a target="_self" href="http://api.ning.com:80/files/GQrjC3iZlvXff-G6g42EUHvcQNnLEYq-LmQanTOlA3RzbYGSgbuDaBlG0GoXQPh3qZ0gBu6whTAXiiQxott2RKn5WkJhJUN5/005.jpg"><img class="align-center" src="http://api.ning.com:80/files/GQrjC3iZlvXff-G6g42EUHvcQNnLEYq-LmQanTOlA3RzbYGSgbuDaBlG0GoXQPh3qZ0gBu6whTAXiiQxott2RKn5WkJhJUN5/005.jpg" width="297"/></a><span class="font-size-1">Figura 5 – Add Reference no projeto<br/> <br/></span></p>
<p>O <b>FirebirdSql.Data.FirebirdClient</b>é composto por diversas classes que contém métodos para acessar os dados do Firebird.</p>
<p> </p>
<p>Criaremos agora a estrutura necessária para trabalharmos no projeto.</p>
<p> </p>
<p>A aplicação será organizada em camadas e como já temos a interface web resta criar a <strong>DAL</strong> (Data Access Layer), <strong>BLL</strong> (Business Logical Layer) e a <strong>DTO</strong> (Data Transfer Object), também conhecida como “<strong>Model</strong>”.</p>
<p> </p>
<p>Para criar as outras camadas, clique com o botão direito no Solution Explorer, “Add” e em seguida “New Project”.</p>
<p align="center"><a href="http://www.ray-silva.net/blog/wp-content/uploads/2011/12/0011.jpg"></a><img src="https://public.blu.livefilestore.com/y1peuWCBQr6a_X5r5JQIkn3WkiRHvQemybxDJA0J40bmBygueeCpRCU-_utUMQIMCU47IZI7ywZPcYWlszIKZctPw/006.jpg?psid=1"/><br/> <span class="font-size-1">Figura 6 – Criando novo projeto</span></p>
<p align="center"><span class="font-size-1"><br/></span></p>
<p>Na tab Visual C#, selecione a opção “Class Library” e dê o nome de DTO.</p>
<p> </p>
<p>Repita o processo e crie o projeto <strong>BLL</strong> e o projeto <strong>DAL</strong>, ficando dessa forma:</p>
<p> </p>
<p align="center"><a href="http://www.ray-silva.net/blog/wp-content/uploads/2011/12/a002.jpg"></a><img src="https://public.blu.livefilestore.com/y1peuWCBQr6a_XDFzExojxgE-Uoa7IbUlDNc6r1X6KfD38r6Ti3Xp94d8atAXHUbiIfjRtfHQ7Bw1AXhNuV2OpsBA/007.jpg?psid=1"/><br/> <span class="font-size-1">Figura 7 – Solution Explorer exibindo projetos</span><br/> Agora que temos o projeto organizado, vamos seguir com a criação das classes.</p>
<p> </p>
<p>Primeiro, vamos trabalhar na camada <strong>DTO</strong>. Essa camada será responsável por “espelhar” as tabelas que temos no banco de dados em nossa aplicação. Na realidade, expressando melhor a idéia, vamos definir as propriedades de nossas classes.</p>
<p></p>
<p>Uma propriedade, é preciso entender em primeiro lugar, se parece muito com uma simples variável, mas é bem mais do que isso. Uma propriedade (também chamada de “atributo”, dependendo da forma como foi definida) é um valor ao qual é associado um método.</p>
<p> </p>
<p>Toda vez que for lido ou gravado o valor da propriedade, métodos podem entrar em ação.<br/> <br/> Essas ações são definidas pelas palavras GET e SET.</p>
<p> </p>
<p>Na prática, pode-se dizer que uma propriedade é composta de três elementos: um campo (local onde se armazena o valor, também chamado de atributo), um método de leitura (get) e um método de gravação (set).</p>
<p> </p>
<p>Utilizando o IB Expert (ferramenta que administra o Firebird), criei um banco de dados e uma tabela chamada “<strong>USUARIO</strong>” para utilizarmos nesse artigo.</p>
<p align="center"><a href="http://www.ray-silva.net/blog/wp-content/uploads/2011/12/a003.jpg"></a><br/> <a target="_blank" href="https://public.blu.livefilestore.com/y1peuWCBQr6a_XcOWOR8fP5RAgQCb90Jr-k8coM3t2HSIUbWwXzwOld0P9FQF45-JWRuN48MQO6WxnTlEd6haknuw/008.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1peuWCBQr6a_XcOWOR8fP5RAgQCb90Jr-k8coM3t2HSIUbWwXzwOld0P9FQF45-JWRuN48MQO6WxnTlEd6haknuw/008.jpg?psid=1"/></a><span class="font-size-1">Figura 8 – Usando IB Expert para criar tabela no Firebird</span></p>
<p> </p>
<p>O que faremos agora é simplesmente criar uma classe em nosso projeto, na camada <strong>DTO</strong>, “espelhando” os tipos de dados da tabela Usuario do Firebird em forma de uma classe.</p>
<p> </p>
<p>Para isso, clique com o botão direito na camada <strong>DTO</strong>, “Add”, “New Item” e selecione uma class. Dê o nome a classe de “UsuarioDTO”.</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pEr1RT_BBS706MdSYuRGNtAsJpmgVtzNHs21svuE2l7WnwzA4nZbnAx23LCZx4ZwOTEQyD3_KGeOfLXAULOYQXQ/009.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pEr1RT_BBS706MdSYuRGNtAsJpmgVtzNHs21svuE2l7WnwzA4nZbnAx23LCZx4ZwOTEQyD3_KGeOfLXAULOYQXQ/009.jpg?psid=1"/></a><span class="font-size-1">Figura 9 – Criando classe</span></p>
<p>Depois, é só criar as propriedades:</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pEr1RT_BBS72RlW2tY28ftumHP85ytYHij4VPvSzruqcWlZaYAwQCCoW_kl_gqtZF1xBVxEvTz5VxWhHwUP61ng/010.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pEr1RT_BBS72RlW2tY28ftumHP85ytYHij4VPvSzruqcWlZaYAwQCCoW_kl_gqtZF1xBVxEvTz5VxWhHwUP61ng/010.jpg?psid=1"/></a><span class="font-size-1">Figura 10 – Criando propriedades da classe</span></p>
<p>Perceba que as propriedades têm o mesmo tipo e o mesmo nome das colunas da tabela “<strong>USUARIO</strong>” no banco de dados.</p>
<p> </p>
<p>Feito isso, partiremos agora para a camada <strong>DAL</strong>, a camada de acesso a dados, onde criaremos uma classe base para manipular acesso a dados.</p>
<p> </p>
<p>Repita os passos acima e crie uma classe, na camada DAL, com o nome de <strong>DBManager</strong>.</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pCbFrHBukjb75yIfmnCdIEYjxQzGM58w54qHZeg12CvknHhAEJrlGIeKYZGWxgOHf6GvbnnkSKCebsuA61IVdTw/011.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pCbFrHBukjb75yIfmnCdIEYjxQzGM58w54qHZeg12CvknHhAEJrlGIeKYZGWxgOHf6GvbnnkSKCebsuA61IVdTw/011.jpg?psid=1"/></a><span class="font-size-1">Figura 11 – Criando classe</span></p>
<p align="center"><span class="font-size-1"><br/></span></p>
<p>Implemente a classe de forma que utilizaremos a Interface “<strong>IDisposable</strong>” e utilize o método <strong>Dispose</strong>().</p>
<p align="center"><a href="http://www.ray-silva.net/blog/wp-content/uploads/2011/12/a007.jpg"></a><br/> <a target="_blank" href="https://public.blu.livefilestore.com/y1pCbFrHBukjb6LA5ILXy6JQL1wsh2FbjBG8ew8F9gHPgTj6Q37VrjIO4brR-GDEEaa94jZBRdd6bOXUK5NlFP3ng/012.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pCbFrHBukjb6LA5ILXy6JQL1wsh2FbjBG8ew8F9gHPgTj6Q37VrjIO4brR-GDEEaa94jZBRdd6bOXUK5NlFP3ng/012.jpg?psid=1"/></a><span class="font-size-1">Figura 12 – Implementando classe DBManager</span></p>
<p align="center"><span class="font-size-1"><br/></span></p>
<p>Criei alguns métodos simples para abrir/fechar conexão e criar um comando SQL.</p>
<p> </p>
<p>Obs: atente-se a referência a <b>FirebirdSql.Data.FirebirdClient</b> e <b>System.Configuration</b>.</p>
<p> </p>
<p>A classe por fim, fica dessa forma:<br/> <br/> <span style="color: #000000;"><strong><span class="font-size-1">using System;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Collections.Generic;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Linq;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Text;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using FirebirdSql.Data.FirebirdClient;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Configuration;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">namespace DAL</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">{</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">    public class DBManager : IDisposable</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">    {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        public void Dispose()</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            GC.SuppressFinalize(this);</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            GC.Collect();</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        }</span></strong></span><br/> <br/> <span style="color: #000000;"><strong><span class="font-size-1">        //recebemos a connection string do Web.Config</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        private String StringConexao =</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">             ConfigurationManager.ConnectionStrings["FirebirdConnectionString"].ToString();</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        public FbConnection AbrirConexao()</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            FbConnection con = new FbConnection(StringConexao);</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            if (con.State != System.Data.ConnectionState.Open)</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">                con.Open();</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            return con;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        }</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        public FbConnection FecharConexao(FbConnection con)</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            if (con.State != System.Data.ConnectionState.Closed)</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">                con.Close();</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            return con;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        }</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        public FbCommand CriarComandoSQL(String Query)</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            FbConnection Conexao = AbrirConexao();</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            FbCommand ComandoSQL = new FbCommand(Query, Conexao);</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">            return ComandoSQL;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">        }</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">    }</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">}</span></strong></span></p>
<p>O próximo passo é criar a connection string no Web.Config.</p>
<p> </p>
<p>Dentro da seção <strong>&lt;System.Web&gt;</strong>, crie a connection string conforme exemplo (lembre-se de mudar o caminho do banco de dados em <span style="text-decoration: underline;"><strong>DATABASE</strong></span>):</p>
<p> </p>
<pre><span style="color: #339966;"><span class="font-size-1">&lt;connectionStrings&gt;<br/> &lt;remove name="LocalSqlServer" /&gt;<br/> &lt;add name="FirebirdConnectionString"<br/> connectionString="User=SYSDBA;Password=masterkey;<br/> <strong>Database</strong>=”CAMINHO DO BANCO DE DADOS”<br/> Port=3050;Dialect=3;Charset=NONE;Role=;Connection lifetime=15;Pooling=false;MinPoolSize=0;MaxPoolSize=50;Packet Size=8192;ServerType=0;"<br/> providerName="FirebirdSql.Data.FirebirdClient" /&gt;<br/> &lt;/connectionStrings&gt;<br/> <br/> </span></span></pre>
<p>E dentro de <strong>&lt;System.Data&gt;</strong>não se esqueça também de incluir o DbProviderFactories:</p>
<p> </p>
<p><span style="color: #339966;" class="font-size-1">&lt;DbProviderFactories&gt;</span><br/> <span style="color: #339966;" class="font-size-1"> &lt;add name="FirebirdClient Data Provider" invariant="FirebirdSql.Data.FirebirdClient" description=".Net Framework Data Provider for Firebird" type="FirebirdSql.Data.FirebirdClient.FirebirdClientFactory, FirebirdSql.Data.FirebirdClient, Version=2.0.0.0, Culture=neutral, PublicKeyToken=3750abcc3150b00c" /&gt;</span><br/> <span style="color: #339966;" class="font-size-1">&lt;/DbProviderFactories&gt;</span></p>
<p><span style="color: #339966;" class="font-size-1"><br/></span></p>
<p>Faremos agora um método na camada de acesso a dados (<strong>DAL</strong>) para obter os dados da tabela de exemplo que foi criada.</p>
<p> </p>
<p>Na camada <strong>DAL</strong>, clique com o botão direito no projeto, “Add”, “New Item” e selecione uma “Class” nomeando a mesma de “UsuarioDAL”.</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pCbFrHBukjb7FVd0AH78-r0mG_VGS-zKuG4be4zEjmZphF6Z_39pNKJSrBSp4EKmu8HJUPZsGHp13vbt8T0O4cQ/013.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pCbFrHBukjb7FVd0AH78-r0mG_VGS-zKuG4be4zEjmZphF6Z_39pNKJSrBSp4EKmu8HJUPZsGHp13vbt8T0O4cQ/013.jpg?psid=1"/></a><span class="font-size-1">Figura 13 – Criando classe</span></p>
<p>Não se esqueça de referenciar a camada “DTO”, para isso, no projeto “DAL” clique em “Add Reference” e na aba “Projects” inclua a referência.<br/> <br/> Também não se esqueça de implementar a interface <strong>IDisposable</strong> e seu método <strong>Dispose</strong>():</p>
<p><span style="color: #000000;"><strong><span class="font-size-1">using System;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Collections.Generic;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Linq;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using System.Text;</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">using DTO;</span></strong></span><br/> <br/> <span style="color: #000000;"><strong><span class="font-size-1">namespace DAL</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">{</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">     public class UsuarioDAL : IDisposable</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">     {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">         public void Dispose()</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">         {</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">         GC.SuppressFinalize(this);</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">         GC.Collect();</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">         }</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">    }</span></strong></span><br/> <span style="color: #000000;"><strong><span class="font-size-1">}</span></strong></span></p>
<p><span style="color: #000000;"><strong><span class="font-size-1"><br/></span></strong></span></p>
<p>Agora, vamos implementar um método que retorne uma Lista de objetos “UsuarioDTO”.</p>
<p> </p>
<p>Entenda que como a aplicação está sendo construída em camadas, cada camada tem suas responsabilidades e suas chamadas.</p>
<p> </p>
<p>Nesse caso, estamos fazendo a chamada da camada de negócios para a camada de acesso a dados.</p>
<p>Método implementado, precisamos agora criar o mesmo método na camada <strong>BLL</strong>para fazer a chamada.</p>
<p> </p>
<p>Na camada <strong>BLL</strong>, clique com o botão direito no projeto, “Add”, “New Item” e selecione uma “Class” nomeando a mesma de “UsuarioBLL”.</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pq6MGmjMNtuRmDLnw8WWT22Q5OhvBsA4LZTy7wLCfyZ3YhQwomcDfJWMfBtoS2UZVSBuEerVa8OwKfzDpbtqs7Q/014.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pq6MGmjMNtuRmDLnw8WWT22Q5OhvBsA4LZTy7wLCfyZ3YhQwomcDfJWMfBtoS2UZVSBuEerVa8OwKfzDpbtqs7Q/014.jpg?psid=1"/></a><span class="font-size-1">Figura 14 – Criando classe</span></p>
<p style="text-align: left;" align="center"><br/> Não se esqueça de referenciar a camada “DTO” e a “DAL”, para isso, no projeto “DAL” clique em “Add Reference” e na aba “Projects” inclua as referências. Também não se esqueça de implementar a interface IDisposable e seu método Dispose().</p>
<p style="text-align: left;" align="center"></p>
<p>Basicamente agora precisamos criar um método que retorne uma lista de objetos “UsuarioDTO” chamando o método da camada <strong>DAL</strong>.</p>
<p> </p>
<p><strong><span class="font-size-1">using System;</span></strong><br/> <strong><span class="font-size-1">using System.Collections.Generic;</span></strong><br/> <strong><span class="font-size-1">using System.Linq;</span></strong><br/> <strong><span class="font-size-1">using System.Text;</span></strong><br/> <strong><span class="font-size-1">using DTO;</span></strong><br/> <strong><span class="font-size-1">using DAL;</span></strong><br/> <strong><span class="font-size-1">namespace BLL</span></strong><br/> <strong><span class="font-size-1">{</span></strong><br/> <strong><span class="font-size-1">    public class UsuarioBLL : IDisposable</span></strong><br/> <strong><span class="font-size-1">    {</span></strong><br/> <strong><span class="font-size-1">        public void Dispose()</span></strong><br/> <strong><span class="font-size-1">        {</span></strong><br/> <strong><span class="font-size-1">            GC.SuppressFinalize(this);</span></strong><br/> <strong><span class="font-size-1">            GC.Collect();</span></strong><br/> <strong><span class="font-size-1">        }</span></strong><br/> <br/> <strong><span class="font-size-1">        public List&lt;UsuarioDTO&gt; ObterUsuarios()</span></strong><br/> <strong><span class="font-size-1">        {</span></strong><br/> <strong><span class="font-size-1">            using (var DAL = new UsuarioDAL())</span></strong><br/> <strong><span class="font-size-1">            {</span></strong><br/> <strong><span class="font-size-1">                return DAL.ObterUsuarios();</span></strong><br/> <strong><span class="font-size-1">            }</span></strong><br/> <strong><span class="font-size-1">        }</span></strong><br/> <strong><span class="font-size-1">    }</span></strong><br/> <strong><span class="font-size-1">} </span></strong></p>
<p><strong><span class="font-size-1"><br/></span></strong></p>
<p>Atente-se novamente ao fato que cada camada tem sua responsabilidade, nesse caso, a camada de negócios apenas faz a chamada para a camada de acesso a dados retornar os dados.</p>
<p>Pronto!</p>
<p> </p>
<p>As camadas foram criadas, os métodos foram escritos e agora precisamos consumir esses dados na camada de InterfaceWeb que criamos.</p>
<p> </p>
<p>Vamos agora incluir uma página web no projeto “Interface Web”.</p>
<p> </p>
<p>Clique com o botão direito no projeto, “Add”, “New Item” e selecione uma “Webform” deixando o nome por default “Webform1.aspx”.</p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1p8ek-zgQw6lgh10rwi2oz4obceTC0ky7J88avn88igCjmof4OnNvG0UJ0UAqS4eguKuqNCA1rJyiH6z_EfZKNpg/015.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1p8ek-zgQw6lgh10rwi2oz4obceTC0ky7J88avn88igCjmof4OnNvG0UJ0UAqS4eguKuqNCA1rJyiH6z_EfZKNpg/015.jpg?psid=1"/></a><span class="font-size-1">Figura 15 – Adicionando um webform ao projeto</span></p>
<p align="center"><span class="font-size-1"><br/></span></p>
<p>Na toolbox, em “Data”, selecione um Gridview.</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pZctJI62izsiVWWDjKK4t1YUMV7kwq7etK-RF2wSH4CVcU3bUi0PPVanFlAc0UsT9jS6umNR0defbws5ufYMAEg/016.jpg?psid=1"><img class="align-center" src="https://public.blu.livefilestore.com/y1pZctJI62izsiVWWDjKK4t1YUMV7kwq7etK-RF2wSH4CVcU3bUi0PPVanFlAc0UsT9jS6umNR0defbws5ufYMAEg/016.jpg?psid=1"/></a><span class="font-size-1">Figura 16 – Selecionando um Gridview</span></p>
<p align="center"><span class="font-size-1"><br/></span></p>
<p>Agora, programaticamente, faremos a chamada para a camada de negócios para executar o método “<strong>ObterUsuarios()</strong>” que por sua vez fará a chamada para a camada de acesso a dados.</p>
<p> </p>
<p>No Code behind, implemente o seguinte código:</p>
<p> </p>
<p><strong><span class="font-size-1">using System;</span></strong><br/> <strong><span class="font-size-1">using System.Collections.Generic;</span></strong><br/> <strong><span class="font-size-1">using System.Linq;</span></strong><br/> <strong><span class="font-size-1">using System.Web;</span></strong><br/> <strong><span class="font-size-1">using System.Web.UI;</span></strong><br/> <strong><span class="font-size-1">using System.Web.UI.WebControls;</span></strong><br/> <strong><span class="font-size-1">using BLL;</span></strong><br/> <br/> <strong><span class="font-size-1">namespace FirebirdDotNet</span></strong><br/> <strong><span class="font-size-1">{</span></strong><br/> <strong><span class="font-size-1">    public partial class WebForm1 : System.Web.UI.Page</span></strong><br/> <strong><span class="font-size-1">    {</span></strong><br/> <strong><span class="font-size-1">        protected void Page_Load(object sender, EventArgs e)</span></strong><br/> <strong><span class="font-size-1">        {</span></strong><br/> <strong><span class="font-size-1">           using (var BLL = new UsuarioBLL())</span></strong><br/> <strong><span class="font-size-1">            {</span></strong><br/> <strong><span class="font-size-1">                GridView1.DataSource = BLL.ObterUsuarios();</span></strong><br/> <strong><span class="font-size-1">                GridView1.DataBind();</span></strong><br/> <strong><span class="font-size-1">            }</span></strong><br/> <strong><span class="font-size-1">        }</span></strong><br/> <strong><span class="font-size-1">    }</span></strong><br/> <strong><span class="font-size-1">}</span></strong></p>
<p><strong><span class="font-size-1"><br/></span></strong></p>
<p>Se tudo ocorrer conforme esperado, os dados serão apresentados.</p>
<p> </p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pZctJI62izshYpnGOV7_4HVgZeTPLmHBERBrun8oNmCixTDd3F-qsl5uWX1tPplujeQVXP3dcrH6dyTfmG973zQ/017.jpg?psid=1"><img class="align-full" src="https://public.blu.livefilestore.com/y1pZctJI62izshYpnGOV7_4HVgZeTPLmHBERBrun8oNmCixTDd3F-qsl5uWX1tPplujeQVXP3dcrH6dyTfmG973zQ/017.jpg?psid=1"/></a></p>
<p align="center"><a target="_blank" href="https://public.blu.livefilestore.com/y1pZctJI62izshYpnGOV7_4HVgZeTPLmHBERBrun8oNmCixTDd3F-qsl5uWX1tPplujeQVXP3dcrH6dyTfmG973zQ/017.jpg?psid=1"></a><span class="font-size-1">Figura 17 – Exibindo dados</span></p>
<p align="center"> </p>
<p>O artigo retratou uma forma simples de incluir o provider do Firebird em nosso projeto ASP.NET, possibilitando a utilização da classe FirebirdSql.Data.FirebirdClient e seus métodos.<br/> <br/> Outros métodos de inserção de dados, atualização e exclusão podem ser implementados seguindo a mesma idéia apresentada.<br/> <br/> <strong>Para saber mais:<br/></strong> <a href="http://www.4shared.com/file/s58GGLlj/ASPNET_Firebird.html" target="_blank">Download do projeto</a></p>
<p><a href="http://www.4shared.com/file/s58GGLlj/ASPNET_Firebird.html" target="_blank"></a><a href="http://devbrasil.net/group/aspnet" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net<br/></a> <a href="http://msdn.microsoft.com/pt-br/library/87d83y5b.aspx" target="_blank">Aprofunde seus conhecimentos sobre Interfaces</a>.<br/> <a href="http://devbrasil.net/profiles/blog/show?id=2307362%3ABlogPost%3A20912&amp;commentId=2307362%3AComment%3A25805" target="_blank">Aprofunde seus conhecimentos sobre Aplicações em Camadas</a>.</p>
<p><strong><span class="font-size-1"><br/></span></strong></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/ScGeykDbujU" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;O Firebird é um banco de dados relacional Open Source que oferece um padrão de SQL ANSI que roda em Windows e uma variedades de plataformas Unix-like, além de oferecer uma ótima concorrência de dados, alto desempenho e uma linguagem poderosa que suporta stored procedures, triggers, etc. O Firebird é usado em ambientes de produção desde 1981.&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/br&gt; Normalmente o SQL Server é eleito como banco de dados em um projeto ASP.NET devido às facilidades e integrações das tecnologias, contudo,…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/xYAIqr5Cfo3bqTZ2A1W5m08UvQ6sZxo0sqoTEUyeHicxjebPBOqHzyBlhcbVrWhEZAyJ63l7q7cXv7innFLKmwC-e9D08hA0/001.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:154010</feedburner:origLink></item><item><title>Imutabilidade de String o que é isto?</title><link>http://feedproxy.google.com/~r/devbrasil/~3/UV9jeT2sICw/2307362:BlogPost:147073</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Rafael Silva dos Anjos</dc:creator><pubDate>Fri, 09 Dec 2011 04:27:29 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-09:2307362:BlogPost:147073</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>A immutabilidade string define que uma objeto do tipo string não pode ter seu valor alterado. É isso mesmo, strings não podem mudar seu valor.</p>
<p> </p>
<p><strong>Como trabalhamos com strings</strong></p>
<p>Naturalmente trabalhamos uma soma de strings desta forma:</p>
<p>string Nome = "João"; // Definimos e atribuimos valor a um objeto string</p>
<p>Nome += " Pereira"; // Efetuamos uma operação de adição a um objeto string</p>
<p>O que à de errado nisso?</p>
<p>Na CLR não é bem assim, uma string é uma sequencia de caracteres unicode, logo após sua criação ela se torna only read e ao trocarmos seu valor uma nova sequencia é criada dando origem a um novo objeto, deixando o objeto anterior sem referência ele vai para o garbage collector.</p>
<p>Para operações como dado o exemplo acima onde criamos um objeto Nome, do tipo string e inicializamos o seu valor e logo em seguida adicionamos um sobrenome não sentimos diferença na performance da aplicação, mais imaginem repetir esta operação um milhão de vezes dentro de um laço de repetição.</p>
<p>Devido a este fato operações com string são tão custosas, devido a esta particularidade do funcionamento de strings que foi criado a classe StringBuilder que otimiza estas operações.</p>
<p>Temos outras formas de trabalhar com strings, uma delas é o string.Format() que facilita a formatação de textos onde podemos parametrizar informações para uma string.</p>
<p>Seguem exemplos:</p>
<p> </p>
<p><em>Caso 01: operação onde existe multiplas adicições em uma string:</em></p>
<p>StringBuilder sb = new StringBuilder();<br/> for (int i = 0; i &gt;= int.MaxValue; i++) //int.MaxValue, constante da classe int32 de valor 2147483647<br/> {<br/>      sb.Append(i.ToString());<br/> }<br/> sb.ToString(); </p>
<p> </p>
<p><em>Caso 02: operação onde existe a necessidade de formatar uma informação qualquer</em></p>
<p>string Nome = "João";</p>
<p>string Sobrenome = "Pereira";</p>
<p>string NomeCompleto = string.Format("{0} {1}",Nome, Sobrenome);</p>
<p> </p>
<p>Bom quando forem realizar operações que envolvam strings e alterações sobre elas, trabalhem com o StringBuilder e ou string.Format(), para obterem uma performance melhor em seus aplicativos, além de estarem escrevendo um código muito mais elegante.<br/> <br/> <span style="font-family: arial black,avant garde;"><strong>Para saber mais:</strong></span><br/> <a target="_blank" href="http://www.csharphelp.com/2011/06/strings-are-immutable/">csharphelp - Strings are Immutable</a><br/> <a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.string.aspx">msdn - system.string</a><br/> <a target="_blank" href="http://msdn.microsoft.com/en-us/library/system.string.aspx#Immutability">msdn - system.string - Immutability</a><br/> <a target="_blank" href="http://msdn.microsoft.com/pt-br/library/ms228362%28v=vs.90%29.aspx">Noções básicas de seqüência de caracteres (guia de programação translation from VPE for Csharp)</a><br/> <a target="_blank" href="http://devbrasil.net/group/cdesenvolvendores">DevBrasil - C# (Csharp)<br/> <br/></a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/UV9jeT2sICw" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;A immutabilidade string define que uma objeto do tipo string não pode ter seu valor alterado. É isso mesmo, strings não podem mudar seu valor.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Como trabalhamos com strings&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Naturalmente trabalhamos uma soma de strings desta forma:&lt;/p&gt;
&lt;p&gt;string Nome = "João"; // Definimos e atribuimos valor a um objeto string&lt;/p&gt;
&lt;p&gt;Nome += " Pereira"; // Efetuamos uma operação de adição a um objeto string&lt;/p&gt;
&lt;p&gt;O que à de errado nisso?&lt;/p&gt;
&lt;p&gt;Na CLR não é bem assim,…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:147073</feedburner:origLink></item><item><title>Primeiros passos no Windows 8 (Developer Preview)</title><link>http://feedproxy.google.com/~r/devbrasil/~3/90KCzzWR6fg/2307362:BlogPost:151891</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Daniel Skroski</dc:creator><pubDate>Mon, 05 Dec 2011 17:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-06:2307362:BlogPost:151891</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><span style="font-family: verdana, geneva;" class="font-size-2">O novo sistema da Microsoft está cheio de novidades para o desenvolvimento, entre elas o HTML5 e o CSS3 que irão funcionar de forma nativa no novo sistema operacional, confira como instalar e quais são as principais novidades que irão fazer a diferença.</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2"><a href="http://api.ning.com:80/files/*UYXR6k-gosnsxA18zfJp*hpKAX8htdaheIRB1nix7Tijsi7jpCmnpWzbpXMgg*8eRfV2vn8RCj3oM4wC7afakGmyY0dRXLV/windows8.jpg" target="_self"><img src="http://api.ning.com:80/files/*UYXR6k-gosnsxA18zfJp*hpKAX8htdaheIRB1nix7Tijsi7jpCmnpWzbpXMgg*8eRfV2vn8RCj3oM4wC7afakGmyY0dRXLV/windows8.jpg?width=600" class="align-left" width="600"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><br/></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><br/> <br/> <br/> Build foi uma conferência realizada em setembro deste ano em Anaheim - Califórina, a conferência teve vários destaques em Windows Phone, Windows 8 com XAML e HTML5 e CSS3.</font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><font size="2"><font size="2"><br/> Para iniciar o desenvolvimento recomendo que instalem o Windows 8 Developer Preview com um Dual Boot, a idéia do artigo é apresentar como iniciar o desenvolvimento das novas tiles.<br/>  </font></font></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;">Quais as principais diferenças entre a Versão 7 e a Versão 8 do Windows?</span></p>
<ol>
<li><span style="font-family: verdana, geneva;" class="font-size-2">O sistema operacional está sendo desenvolvido para ser responsivo, ou seja vai funcionar em diversos tamanhos de telas diferentes com experiência de usuário adaptada.</span></li>
<li><span style="font-family: verdana, geneva;" class="font-size-2">Na versão preview foi dividida as aplicações com o visual de "Tiles" e outra semelhante a do Windows 7.</span></li>
<li><span style="font-family: verdana, geneva;" class="font-size-2">O WPF e o HTML5/CSS3 serão as principais formas de desenvolvimento.</span></li>
<li><span style="font-family: verdana, geneva;" class="font-size-2">Além do C++/C#/VB, o JavaScript também vai ser usado nativamente.</span></li>
<li><span style="font-family: verdana, geneva;" class="font-size-2">O objetivo principal da Microsoft é deixar com que funcione aplicativos desenvolvidos com HTML5/CSS3 ou XAML nativamente, assim desenvolvedores de outras linguagens vão ter uma curva de aprendizado menor!</span></li>
</ol>
<p><span style="font-family: verdana, geneva;" class="font-size-2"> </span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;">O HTML5</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2">Nada mais é do que uma nova semântica da W3C, agora temos tags como &lt;header&gt;, &lt;article&gt;, &lt;section&gt; entre muitas outras, mas ele sozinho é muito pobre, e talvez até acrescente apenas uma organização muito maior e uma semântica correta para "sempre". É importante saber que nem todos os browsers vão funcionar o HTML5 e muito menos o CSS3, então veja uma tabela sobre quais deles já estão aptos a esta função.</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2"><a href="http://www.creationpool.de/blog/wp-content/uploads/2010/03/browsertabelle.png" target="_blank"><img src="http://www.creationpool.de/blog/wp-content/uploads/2010/03/browsertabelle.png?width=600" class="align-full" width="600"/></a></span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;">O CSS3</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2">Podemos dizer que a versão 3 do CSS está fazendo a diferença! Pois além de organizar as informações, está adicionando funcionalidades importantes na usabilidade, podemos dizer que a web não será mais a mesma depois da CSS3, pois com isto estamos enterrando para sempre o FLASH, e de quebra a Microsoft está se tornando mais padronizada em relação a W3C!</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2"> </span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2">Produzida por vários "fabricantes", vou denominá-los assim, entre os mais conhecidos estão a Mozilla usa o prefixo -moz, e a Microsoft que usa o prefixo -ms, estes e alguns outros provavelmente, estão criando inúmeras propriedades para deixar como sugestão para a W3C adotar estes padrões, mas tudo ainda com muita incerteza.</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2">Abaixo uma lista com as principais propriedades que estão sendo criadas:</span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2"><em>Exemplo de uso css: style="<span style="color: #ff0000;">opacity:0.50;</span> <span style="color: #ff0000;">-ms-transform: rotate(94deg);</span>"</em></span></p>
<ol>
<li><span style="font-family: verdana, geneva;" class="font-size-2">Transparency</span><br/> <span style="font-family: verdana, geneva;" class="font-size-2">Agora podemos adicionar transparencia nos elementos HTML e HTML5 através do atributo "style".</span><br/> <br/> <span style="font-family: verdana, geneva;" class="font-size-2"><em>Exemplo com 50% de transparencia:</em></span><p><span style="color: #ff0000; font-family: verdana, geneva;" class="font-size-2"><em>opacity: 0.50;</em></span></p>
</li>
<li><div><p><span style="font-family: verdana, geneva;" class="font-size-2">Border Radius<br/> Com a CSS3 não é necessário usar javaScript ou imagens para deixar as bordas arredondadas, o interessante é que pode se escolher em quais arestas e quanto de radius em cada vértice.</span><br/> <br/> <span style="font-family: verdana, geneva;" class="font-size-2"><em>Exemplo com arestas diferentes:</em></span></p>
<div id="markup"><p><span class="font-size-2" style="color: #ff0000; font-family: verdana, geneva;"><em>border-radius: 10px 0px 10px 10px;</em></span></p>
</div>
</div>
</li>
<li><div><div><p><span style="font-family: verdana, geneva;" class="font-size-2">Box Shadow<br/> Efeitos embassados em HTML? Isso mesmo, com o box-shadow em breve poderemos fazer a sombra nos padrões da W3C.<br/> <br/> <em>Exemplo com sombras internas na figura:</em></span></p>
<div id="markup"><div id="markup"><p><span style="color: #ff0000; font-family: verdana, geneva;" class="font-size-2"><em>box-shadow: inset 5px 12px 22px 0px hsl(59,88%,54%);<br/> <br/></em></span></p>
</div>
</div>
</div>
</div>
</li>
<li><div><div><span style="font-family: verdana, geneva;" class="font-size-2">Text Shadow<br/> Funciona igual ao box-shadow, porém, somente para fora das letras, o inset somente para o box-shadow.</span><br/> <br/> <span style="font-family: verdana, geneva;" class="font-size-2"><em>Exemplo com sombras avermelhada:</em></span><br/><div><div><p><span class="font-size-2" style="font-family: verdana, geneva;"><em><span style="color: #ff0000;">text-shadow: 6.5px 0px 0px 0px hsla(6, 86%, 54%, 0.25);<br/> <br/></span></em></span></p>
</div>
</div>
</div>
</div>
</li>
<li><div><div><span style="font-family: verdana, geneva;" class="font-size-2">Gradients<br/> Agora sem precisar do Photoshop, é possível criar gradients via código CSS3, com certeza uma grande evolução gráfica para os padrões.</span><br/> <br/> <span style="font-family: verdana, geneva;" class="font-size-2"><em>Exemplo com 3 cores no gradiente:<br/> <br/></em></span><div id="markup"><p><span style="color: #ff0000; font-family: verdana, geneva;" class="font-size-2">background-image: -ms-linear-gradient(90deg, black 0%, yellow 26%, red 100%);</span></p>
</div>
</div>
</div>
</li>
<li><div><div><span style="font-family: verdana, geneva;" class="font-size-2">Typography<br/> Agora com o @font-face é possível usar fontes que jamais era possível antigamente.</span><br/> <span style="font-family: verdana, geneva;" class="font-size-2"><br/> <br/> <span style="color: #ff0000;">&lt;style type="text/css"&gt;</span></span><p><span style="color: #ff0000; font-family: verdana, geneva;" class="font-size-2">@font-face { font-family: FelbridgeOTSCondensed; src: url('fonts/FelbridgeOTS-Condensed.woff'); }</span></p>
<p><span class="font-size-2" style="color: #ff0000; font-family: verdana, geneva;">@font-face { font-family: CelesteSmallSCRegular; src: url('fonts/CelesteSmallTextScWeb.woff'); }</span></p>
<p><span class="font-size-2" style="color: #ff0000; font-family: verdana, geneva;">&lt; /style&gt;<br/> <br/></span></p>
</div>
</div>
</li>
<li><div><div><span class="font-size-2" style="font-family: verdana, geneva;"><span style="color: #000000;">2D Transforms<br/> Com estas propriedades podemos movimentar os objetos no eixo X,Y.</span></span><div id="markup"><p><span style="font-family: verdana, geneva;" class="font-size-2">Exemplo com propriedades, rotate, scale, skew.</span></p>
</div>
<div id="markup"><p><span class="font-size-2" style="color: #ff0000; font-family: verdana, geneva;">-ms-transform-origin: 50% 50%;</span></p>
</div>
<p><span class="font-size-2" style="color: #ff0000; font-family: verdana, geneva;">-ms-transform: translate(147px, 72px) rotate(23deg) scale(1.2) skew(15.99deg, 15deg) skewY(21deg) rotate(42deg);</span></p>
<p><span class="font-size-2" style="font-family: verdana, geneva;"><span style="color: #000000;"><br/></span></span></p>
</div>
</div>
</li>
<li><div><div><span class="font-size-2" style="font-family: verdana, geneva;"><span style="color: #000000;">3D Transforms<br/> Com estas propriedades podemos movimentar os objetos no eixo X,Y,Z. <br/></span></span><div id="markup"><p><span style="font-family: verdana, geneva;" class="font-size-2">Exemplo com propriedades, rotate, scale, skew.</span></p>
</div>
<div id="markup"><p><span class="font-size-2" style="font-family: verdana, geneva;"><em><span style="color: #ff0000;">-ms-backface-visibility: visible;<br/> -ms-transform-origin: 56% 50%;<br/> -ms-transform: perspective(850px) rotateY(-49deg) translate3d(193px, 48px, 37px);</span></em></span></p>
</div>
</div>
</div>
</li>
<li><div><div><span style="font-family: verdana, geneva;" class="font-size-2"><span style="color: #000000;">Transitions</span><span style="color: #000000;"><br/></span> <span style="color: #000000;">Com estas propriedades é possível fazer transições e animar seus objetos</span></span><p><span class="font-size-2" style="color: #ff0000; font-family: verdana, geneva;">-ms-transform: rotate(94deg);<br/></span> <br/> <span style="color: #ff0000; font-family: verdana, geneva;" class="font-size-2">-ms-transition:1.8s cubic-bezier(0.00, 0.46, 0.25, 1.00) 2.5s;</span></p>
</div>
</div>
</li>
</ol>
<p><span class="font-size-2" style="font-family: verdana, geneva;">O XAML continua sendo utilizado da mesma maneira, mas agora os layouts das aplicações Windows 8 terão como padrão a Metro, o XAML está entre nós desde de 2006, não tem como descontinuar todas as inovações que já foram feitas com ele, e transportar para as propriedades em HTML5 e CSS3.<br/>  </span></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2"><font size="2"><strong>Para saber mais:</strong><a href="http://devbrasil.net/group/css" target="_self"><br/> Comunidade de CSS na @devbrasil<br/></a></font></span><a href="http://devbrasil.net/group/windows-8" target="_blank" style="font-family: verdana, geneva; font-size: small;">Comunidade do Windows 8 na @devbrasil<br/></a><a href="http://www.techtudo.com.br/dicas-e-tutoriais/noticia/2011/09/como-instalar-o-windows-8-em-dual-boot-com-o-windows-7.html" target="_blank" style="font-family: verdana, geneva;">Baixe o Developer Preview, e não esqueça, faça um dual boot<br/></a><a href="http://www.buildwindows.com" target="_blank" style="font-family: verdana, geneva;">Conferencia sobre o Windows 8<br/></a><a href="http://ie.microsoft.com/testdrive/Graphics/hands-on-css3/" target="_blank" style="font-family: verdana, geneva;">Conheça mais propriedades em CSS3<br/></a><a href="http://samples.msdn.microsoft.com/ietestcenter/" target="_blank" style="font-family: verdana, geneva;">Teste o Internet Explorer 10 e HTML5 com CSS3<br/></a><a href="http://msdn.microsoft.com/en-us/windows/apps" target="_blank" style="font-family: verdana, geneva;">Todo o desenvolvimento do Windows 8 neste link da MSDN</a></p>
<p><span style="font-family: verdana, geneva;" class="font-size-2"> </span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/90KCzzWR6fg" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;span class="font-size-2" style="font-family: verdana, geneva;"&gt;O novo sistema da Microsoft está cheio de novidades para o desenvolvimento, entre elas o HTML5 e o CSS3 que irão funcionar de forma nativa no novo sistema operacional, confira como instalar e quais são as principais novidades que irão fazer a diferença.…&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/*UYXR6k-gosnsxA18zfJp*hpKAX8htdaheIRB1nix7Tijsi7jpCmnpWzbpXMgg*8eRfV2vn8RCj3oM4wC7afakGmyY0dRXLV/windows8.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:151891</feedburner:origLink></item><item><title>Primeiros passos nos testes unitários</title><link>http://feedproxy.google.com/~r/devbrasil/~3/-3_9T0UJKGU/2307362:BlogPost:150940</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Márcio Araújo</dc:creator><pubDate>Thu, 01 Dec 2011 09:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-12-01:2307362:BlogPost:150940</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><span>Implementar teste unitário é uma ótima maneira de detectar erros no início do processo de desenvolvimento, se você dedicar tempo para escrever testes adequado vai eliminar uma grande parte de bugs no seu software, criando uma proteção para o cliente. Aprenda nesse artigo como criar testes unitários no Visual Studio. <br/><br/>Primeiramente vamos criar um projeto no visual studio File -&gt; New -&gt; Project. Dê um nome ao projeto por exemplo TesteUnitario conforme apresentado na figura abaixo.<br/> <br/>
</span></p>
<p><a target="_self" href="http://api.ning.com:80/files/g27-xCR72GIqvVdGfj8TJ-yfhutc7egL6HsbVB93O3Rla7nGr0N*FuqTwVCxfZ8*KPjPxVTlR5oe5tziLXQkHlDvdyBiXv1H/Tela2.jpg"><img class="align-full" width="750" src="http://api.ning.com:80/files/g27-xCR72GIqvVdGfj8TJ-yfhutc7egL6HsbVB93O3Rla7nGr0N*FuqTwVCxfZ8*KPjPxVTlR5oe5tziLXQkHlDvdyBiXv1H/Tela2.jpg?width=750"/></a></p>
<p><span>Feito isso, renomei a class1.cs que é criada automaticamente na solucion explorer para Soma. conforme a imagem abaixo : <br/> <br/>
</span></p>
<p><a target="_self" href="http://api.ning.com:80/files/EIIg06zQ5m7OiHUzMOvMKlJAtFx-Ib7poNRy00FiyCVM5iL64OqqrdwKT9N39tWj38CGmRzv9lqjz3hCp81cEnRtFp0IUl4b/Tela3.jpg"><img class="align-full" width="547" src="http://api.ning.com:80/files/EIIg06zQ5m7OiHUzMOvMKlJAtFx-Ib7poNRy00FiyCVM5iL64OqqrdwKT9N39tWj38CGmRzv9lqjz3hCp81cEnRtFp0IUl4b/Tela3.jpg"/></a></p>
<p> </p>
<p> </p>
<p>Após alteração efetuada sua classe ficará com o nome de Soma.cs. Então criaremos um método chamado "somar" com seus respectivos parâmetros : </p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/NbmtWvAkYXPJoODzJMHYkwOP3wN4lQsoKji6buZU6uOAsiuBm6GdgZ-POhRMeUfpVwa5qAh3Sj0N2fR8X8W3SWPOK86tSi7q/tela4.jpg"><img class="align-full" width="473" src="http://api.ning.com:80/files/NbmtWvAkYXPJoODzJMHYkwOP3wN4lQsoKji6buZU6uOAsiuBm6GdgZ-POhRMeUfpVwa5qAh3Sj0N2fR8X8W3SWPOK86tSi7q/tela4.jpg"/></a></p>
<p> </p>
<p>Para criar um teste no visual studio é muito fácil, basta clicar com o direito( mouse ) na classe criada e ir na opção create unit tests...<br/> <br/>
</p>
<p><a target="_self" href="http://api.ning.com:80/files/NbmtWvAkYXNeilQELhOQa0KnDM1zizERp9yOBqHA98bEvzRacONksO5QRaG*qXQXDFUivhTH8jHPLDnexF0cvnehSyTDHK5U/tela5.jpg"><img class="align-full" width="510" src="http://api.ning.com:80/files/NbmtWvAkYXNeilQELhOQa0KnDM1zizERp9yOBqHA98bEvzRacONksO5QRaG*qXQXDFUivhTH8jHPLDnexF0cvnehSyTDHK5U/tela5.jpg"/></a></p>
<p><br/> Aparecerá uma tela de informação nesse momento não mudamos nada apenas apertamos o OK. Definimos também o nome do projeto de teste. Automaticamente é criado uma classe de testes com todas as infomações necessárias.</p>
<p> </p>
<p><a target="_blank" href="http://img17.imageshack.us/img17/4587/tela6k.jpg"><img class="align-full" width="400" src="http://img17.imageshack.us/img17/4587/tela6k.jpg?width=400"/></a></p>
<p> </p>
<p> </p>
<p><img width="400" src="http://img23.imageshack.us/img23/9854/tela7.png?width=400"/></p>
<p><br/> Por padrão o visual studio cria o escopo de teste dependendo da quantidade de metodos criados na classe principal.</p>
<p> </p>
<p><a target="_blank" href="http://img94.imageshack.us/img94/2258/tela8.png"><img class="align-full" width="400" src="http://img94.imageshack.us/img94/2258/tela8.png?width=400"/></a></p>
<p>Note que aparecerá os atributos [TestClass()] para classe criada e [TestMethod()] para os metodos criados. Esses atributos são os responsáveis pela execução dos testes no Visual Studio.</p>
<p> </p>
<p><a target="_blank" href="http://img809.imageshack.us/img809/7320/tela9.png"><img class="align-full" width="400" src="http://img809.imageshack.us/img809/7320/tela9.png?width=400"/></a></p>
<p> </p>
<p> </p>
<p> </p>
<p>Para iniciar a validação dos testes basta executar no menu Test &gt; Run &gt; All tests in solution.</p>
<p> </p>
<p><a target="_blank" href="http://img213.imageshack.us/img213/3344/tela10.png"><img class="align-full" width="400" src="http://img213.imageshack.us/img213/3344/tela10.png?width=400"/></a></p>
<p>Deve aparecer a seguinte tela : </p>
<p> </p>
<p><a target="_blank" href="http://img832.imageshack.us/img832/6020/tela11.png"><img class="align-full" width="350" src="http://img832.imageshack.us/img832/6020/tela11.png?width=350"/></a></p>
<p>Consequentemente os testes irão falhar devido a chamada do método Assert.Inconclusive. O visual studio por padrão declara esse metodo para o desenvolvedor não esquecer de revisar todos os métodos criados. </p>
<p> </p>
<p>Para o teste funcionar normalmente basta remover a linha do Assert.Inconclusive e rodar novamente os testes no menu Test &gt; Run &gt; All tests in solution.</p>
<p><a target="_blank" href="http://img830.imageshack.us/img830/6743/tela12.png"><img class="align-full" width="400" src="http://img830.imageshack.us/img830/6743/tela12.png?width=400"/></a></p>
<p> </p>
<p>Enfim o teste está válido e você já deu um grande passo no desenvolvimento de seu software</p>
<p> </p>
<p>Aos poucos, O uso de testes unitários tem sido adotado em pequena e grande softhouse. Com isto, os desenvolvedores garantem um código seguro, criando uma documentação muito valiosa de seu código fonte. O exemplo relatado no artigo foi apenas uma demonstração de como pode ser criado vários testes unitários conforme a usabilidade do software.Não perca tempo, participe, comente este artigo e diga sua opinião.<br/> <br/>
<strong>Para saber mais:</strong> </p>
<p><a target="_self" href="http://devbrasil.net/group/alm">Aprofunde seus conhecimentos sobre este tema na comunidade ALM</a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/-3_9T0UJKGU" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;span&gt;Implementar teste unitário é uma ótima maneira de detectar erros no início do processo de desenvolvimento, se você dedicar tempo para escrever testes adequado vai eliminar uma grande parte de bugs no seu software, criando uma proteção para o cliente. Aprenda nesse artigo como criar testes unitários no Visual Studio. &lt;br&gt;&lt;/br&gt;&lt;br&gt;&lt;/br&gt;Primeiramente vamos criar um projeto no visual studio File -&amp;gt; New -&amp;gt; Project. Dê um nome ao projeto por exemplo TesteUnitario conforme apresentado na figura…&lt;/span&gt;&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/g27-xCR72GIqvVdGfj8TJ-yfhutc7egL6HsbVB93O3Rla7nGr0N*FuqTwVCxfZ8*KPjPxVTlR5oe5tziLXQkHlDvdyBiXv1H/Tela2.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:150940</feedburner:origLink></item><item><title>Paginação com webmatrix e MySQL ou SQL Server Compact</title><link>http://feedproxy.google.com/~r/devbrasil/~3/FlpbG4G1KJY/2307362:BlogPost:147238</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Rafael Martins</dc:creator><pubDate>Mon, 28 Nov 2011 09:30:00 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-11-28:2307362:BlogPost:147238</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Aprenda como paginar dados usando um o modelo que poderá ser usado tanto para SQL Compact quanto MySql, em aplicações web feitas em webmatrix, usando razor (ASP.NET MVC 3).</p>
<p>Vamos lá, primeiramente faça download do arquivo no link no final do post, extraia e teremos dois arquivos, um com extensão ".cs" que será uma classe em csharp, e o outro em ".cshtml", extensão para Webpages asp.net em razor usando csharp. O primeiro será para a classe em que se dará a lógica da paginação e o segundo é onde teremos nosso helper que cuidará dos nossos links de paginação.</p>
<p> </p>
<p>Usando um webgrid ou o grid view (a depender do tipo do asp.net, se MVC ou webforms) temos um recurso pronto de paginação, porém esse recurso tem um pequeno gigante problema: ele filtra os dados a serem apresentados, mas não a serem carregados. Ou seja, ele puxa todos os registros da tabela e depois apenas filtra pra apresentação, e isso não adianta coisa nenhuma a não ser esteticamente, mas no que diz respeito a performance do seu site, isso não funciona.</p>
<p>Então ao descobrir isso você vai vasculhar a internet atraz de uma solução e aqui estamos. Quem está acostumado a MySQL usa a função LIMIT, mas quem usa SQL server Compact não tem esse recurso... O que fazer? Tem jeito pra isso, a classe no arquivo que ".cs" tem solução para os dois casos.</p>
<p> </p>
<p>Presumindo que você sabe usar o webmatrix e entendeu como funciona a estrutura de uma aplicação asp.net mvc3, dentro do seu diretorio "App_Code" coloque os arquivos "paginar.cs" e "meusHelpers.cshtml".</p>
<p> </p>
<p>Feito isso crie um documento "index.cshtml" na raiz e tenha também aí uma tabela no banco de dados que você vai usar.</p>
<p>Temos nosso código:</p>
<p> <br/><span style="color: #ff0000;">@{</span><br/>    <span style="color: #000080;">Page</span>.dataCon = <span style="color: #0000ff;">Database</span>.Open(<span style="color: #800000;">"minhaConexao"</span>);<br/>    <span style="color: #0000ff;">var</span> totalRegistros = <span style="color: #000080;">Page</span>.dataCon.QuerySingle(<span style="color: #800000;">"SELECT COUNT(*) AS totalReg FROM minhaTabela"</span>);<br/><span style="color: #ff0000;">}</span><br/>&lt;!DOCTYPE html&gt;<br/>&lt;html lang="pt-br"&gt;<br/>    &lt;head&gt;<br/>        &lt;meta charset="utf-8" /&gt;<br/>        &lt;title&gt;Exercício de paginação&lt;/title&gt;<br/>    &lt;/head&gt;<br/>    &lt;body&gt;<br/>    &lt;/body&gt;<br/>&lt;/html&gt;<br/>Nosso objeto "totalRegistros" nos informará quantos registros temos. Você deve usar com um índice como array. Então dentro de &lt;body&gt; você deverá inserir o seguinte código:</p>
<p> </p>
<p><span style="color: #ff0000;">@</span><span style="color: #0000ff;">if</span> (totalRegistros[0] &gt; 0)<br/>{<br/>    <span style="color: #0000ff;">int</span> atualPagina = <span style="color: #000080;">Convert</span>.ToInt16(Request[<span style="color: #800000;">"pagina"</span>]);</p>
<p><span style="color: #000080;">Paginar</span> ObjPgnador = <span style="color: #0000ff;">new</span> <span style="color: #000080;">Paginar</span>(v_iPerPg: 20,<br/>                                     v_totalReg: totalRegistros[0],<br/>                                     v_pgna: atualPagina,<br/>                                     v_itens: <span style="color: #800000;">"id, nome, telefone "</span>,<br/>                                     v_tabela: <span style="color: #800000;"><span style="color: #800000;">"minhaTabela"</span></span>,<br/>                                     v_orderBy: <span style="color: #800000;">"nome"</span>,<br/>                                     v_MySql: <span style="color: #0000ff;">true</span>);</p>
<p><span style="color: #0000ff;">var</span> queryList = <span style="color: #000080;">Page</span>.dataCon.Query(ObjPgnador.queryStr);</p>
<p><span style="color: #ff0000;">&lt;text&gt;</span><br/>        &lt;table cellpadding="0" cellspacing="0"&gt;<br/>            &lt;tr&gt;<br/>                &lt;th&gt;id&lt;/th&gt;<br/>                &lt;th&gt;Nome&lt;/th&gt;<br/>                &lt;th&gt;Telefone&lt;/th&gt;<br/>            &lt;/tr&gt;<br/>            <span style="color: #ff0000;">@</span><span style="color: #0000ff;">for</span> (<span style="color: #0000ff;">int</span> i = 0; i &lt; queryList.Count; i++)<br/>            {<br/>                <span style="color: #ff0000;">&lt;text&gt;</span><br/>                    &lt;tr&gt;<br/>                        &lt;td&gt;<span style="color: #ff0000;">@(</span>queryList[i].id<span style="color: #ff0000;">)</span>&lt;/td&gt;<br/>                        &lt;td&gt;<span style="color: #ff0000;">@(</span>queryList[i].nome<span style="color: #ff0000;">)</span>&lt;/td&gt;<br/>                        &lt;td&gt;<span style="color: #ff0000;">@(</span>queryList[i].telefone<span style="color: #ff0000;">)</span>&lt;/td&gt;<br/>                    &lt;/tr&gt;<br/>                <span style="color: #ff0000;">&lt;/text&gt;</span><br/>            }<br/>        &lt;/table&gt;</p>
<p><span style="color: #008000;">        //abaixo aplicamos nosso helper HTML para fazer a listagens de páginas</span></p>
<p><span style="color: #ff0000;">@</span><span style="color: #0000ff;">meusHelpers</span>.pageHelper(pgUrl:<span style="color: #800000;">"/index.cshtml?"</span>, pg: ObjPgnador.pagina, pgStart: ObjPgnador.pageStart, pgEnd: ObjPgnador.pageEnd, pgLinks: ObjPgnador.pageLinks)<br/>    <span style="color: #ff0000;">&lt;/text&gt;</span><br/>    }<br/><span style="color: #0000ff;">else</span><br/>{<br/>    <span style="color: #ff0000;">@:</span>&lt;h6&gt;Nenhuma informação encontrada!&lt;/h6&gt;<br/>}</p>
<p> </p>
<p>Ao instanciar nosso objeto, precisamos apenas informar os seguintes parâmetros:</p>
<p> </p>
<p>v_iPerPg: 20, <span style="color: #008000;">//quantos registros por página</span><br/>v_totalReg: totalRegistros[0], <span style="color: #008000;">//informa o total de registro da tabela</span><br/>v_pgna: atualPagina, <span style="color: #008000;">//a página atual onde está o usuário</span><br/>v_itens: <span style="color: #800000;">"id, nome, telefone "</span>, <span style="color: #008000;">//as colunas desejadas</span><br/>v_tabela: <span style="color: #800000;"><span style="color: #800000;">"minhaTabela"</span></span>, <span style="color: #008000;">//a tabela escolhida</span><br/>v_orderBy: <span style="color: #800000;">"nome"</span>, <span style="color: #008000;">//a coluna que será usada para ordenação</span><br/>v_MySql: <span style="color: #0000ff;">true <span style="color: #008000;">//true para string MySql, false para SQL Serber compact</span></span></p>
<p> </p>
<p>Agora que entendemos como motamos nosso objeto, vamos entender nosso helper:</p>
<p> </p>
<p>pgUrl:<span style="color: #800000;">"/index.cshtml?"</span>, <span style="color: #008000;">//informa o documento para monategm da url</span></p>
<p>pg: ObjPgnador.pagina, <span style="color: #008000;">//informa a página atual, e é necessario ser do objeto em vez da variável "atualPagina", para evitarmos que alguém insira via url uma página que exceda nossa quantidade real.</span></p>
<p>pgStart: ObjPgnador.pageStart, <span style="color: #008000;">//informa nossa página inicial</span></p>
<p>pgEnd: ObjPgnador.pageEnd, <span style="color: #008000;">//informa a última página na apresentação, lembrando que não é a página final da contagem total, por exemplo, vc pode ter registros pra 50 páginas, mas só apresenta 15 por vez, no caso esse seria o 15º link.</span></p>
<p>pgLinks: ObjPgnador.pageLinks <span style="color: #008000;">//informa o total de páginas</span></p>
<p> </p>
<p>Como vocês puderam ver, aqui temos um sistema de paginação completo, seja pra MySql ou SQL compact, desde a filtragem de dados pela classe até o helper que trará o menu de links e ambos podem ser usados em qualquer página do seu site, dispensando que você reescreva a lógica em todas as páginas que você necessite de paginação, bastando chamar os objetos. Em ambos os casos funciona da mesma forma e não trazem registros além do que nós precisamos por cada página, diferente do modelo padrão do gridview ou do webgrid. Vocês podem personalizar adicionando parâmetros como por exemplo se vai ser ordenado em ordem crescente ou decrescente.<br/><strong><br/>Para saber mais:<br/><a target="_blank" href="http://api.ning.com:80/files/Sk3cHPPsnSMgzRo5su9KNEXumqWS7-V53mUtTuADoDyTneH3oLWCvHM3adsdeJ09MbbZp9NH0uayLS2BAAtRs17WD6yocL93/ArtigoPag__.rar">Download do código fonte</a><br/><a target="_blank" href="http://www.4shared.com/file/xv6aU7cT/paginar.html">Download do código fonte 4Shared</a><br/></strong><a target="_self" href="http://devbrasil.net/group/aspnet">Aprofunde seus conhecimentos na comunidade de ASP.NET</a></p>
<p> </p>
<p> </p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/FlpbG4G1KJY" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Aprenda como paginar dados usando um o modelo que poderá ser usado tanto para SQL Compact quanto MySql, em aplicações web feitas em webmatrix, usando razor (ASP.NET MVC 3).&lt;/p&gt;
&lt;p&gt;Vamos lá, primeiramente faça download do arquivo no link no final do post, extraia e teremos dois arquivos, um com extensão ".cs" que será uma classe em csharp, e o outro em ".cshtml", extensão para Webpages asp.net em razor usando csharp. O primeiro será para a classe em que se dará a lógica da paginação e o…&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:147238</feedburner:origLink></item><item><title>Criando um Repositório Genérico Com EFCodeFirst (EntityFramework 4.1)</title><link>http://feedproxy.google.com/~r/devbrasil/~3/-Ob4MHXRw0s/2307362:BlogPost:147439</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Yan de Lima Justino</dc:creator><pubDate>Thu, 17 Nov 2011 17:24:38 PST</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-11-18:2307362:BlogPost:147439</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Frameworks, em alguns aspectos, são ferramentas poderosas que auxiliam no desenvolvimento, adiantando tarefas massantes e repetitivas. O EntityFramework é poderoso framework não só de persistência, mas manipulação de dados, uma vez que também tenta dar conta de outros aspectos referentes as complexas rotinas de um sistema de base de dados. Aliado aos mais potentes recursos das linguagens .net, é possível se alcançar agilidade e diminuir o custo de escrita de classes de persistência que apresentam um aspecto de CRUD. Aqui demonstrarei como escrever uma classe Genérica de persistência usando os recursos do EFCodeFirst.</p>
<p> </p>
<p><strong>Criando contratos das Entidades de negócio</strong></p>
<p>Primeiramente vamos escrever nossa interface que servirá de contrato para nosso repositório. Para isso usaremos os recursos da classe System.Collections.Generic. Abaixo segue o fonte de nossa interface.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/eG236fOCOsBd4OwWsXxD7dFty1t5caFA0nfY2DrPrXVCqOBHVa156HEG03WxpjHev8NHEJYbEWmOj47yGr3yVW5LXT7WHGNO/01.jpg"><img class="align-full" width="493" src="http://api.ning.com:80/files/eG236fOCOsBd4OwWsXxD7dFty1t5caFA0nfY2DrPrXVCqOBHVa156HEG03WxpjHev8NHEJYbEWmOj47yGr3yVW5LXT7WHGNO/01.jpg"/></a></p>
<p>Observe que "&lt;T&gt;" é uma representação de IEntity que não passa de uma interface usada como contrato para todas as entidades da regra de negócio.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/re37YTTFP0-U23xR7oxEJm7Ywfa5FSwb1UyeNzQDrxmOFC6O9Zym1CS-1LHppmaT2iZcLqzTFT6e4y2uPaqHLd4sHbTZdC2U/02.jpg"><img class="align-full" width="300" src="http://api.ning.com:80/files/re37YTTFP0-U23xR7oxEJm7Ywfa5FSwb1UyeNzQDrxmOFC6O9Zym1CS-1LHppmaT2iZcLqzTFT6e4y2uPaqHLd4sHbTZdC2U/02.jpg"/></a></p>
<p> </p>
<p><strong>Implementação dos contratos</strong></p>
<p>Abaixo segue uma implementação da interface IEntity</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/g0XUbHMd0UWdc*SvEB6i2OOhPzx21r9ww*14VmJe1FXCmkgwrrIuUxpJUT6LZ845AkA1pp2JhfQRVPy4Xqk5GvSxuPRCDcCZ/03.jpg"><img class="align-full" width="635" src="http://api.ning.com:80/files/g0XUbHMd0UWdc*SvEB6i2OOhPzx21r9ww*14VmJe1FXCmkgwrrIuUxpJUT6LZ845AkA1pp2JhfQRVPy4Xqk5GvSxuPRCDcCZ/03.jpg"/></a></p>
<p>Abaixo segue a implementação da interface IRepository&lt;T&gt;</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/9jkM0fzRA*HE4Z4lgFOwhUyTrpSFcIdCOUeTBSchGD6eLSMjZlNy7*tfu21bpTECXduDLjpa0N15lJWlVcxQ0PIPZAG9b*w3/04.jpg"><img class="align-full" width="610" src="http://api.ning.com:80/files/9jkM0fzRA*HE4Z4lgFOwhUyTrpSFcIdCOUeTBSchGD6eLSMjZlNy7*tfu21bpTECXduDLjpa0N15lJWlVcxQ0PIPZAG9b*w3/04.jpg"/></a><a target="_self" href="http://api.ning.com:80/files/k0-bEQzsz8HDNs1Mh-dscV7rWIiTN9BsN-F-yyMPJKFQSgFyDflE-wCitVZ7pMggM4L2zvxHnlm8K6N7ZsQz2jSfQ4oezc0P/05.jpg"><img class="align-full" width="668" src="http://api.ning.com:80/files/k0-bEQzsz8HDNs1Mh-dscV7rWIiTN9BsN-F-yyMPJKFQSgFyDflE-wCitVZ7pMggM4L2zvxHnlm8K6N7ZsQz2jSfQ4oezc0P/05.jpg"/></a></p>
<p>O código acima não é o suficiente para que a "mágica" aconteça. Perceba que a criação do nosso repositório genérico é exigido um objeto DbContext. Este objeto pertence a classe System.Data.Entity. Ele faz parte do Entityframework e abstrai as tarefas de consulta e persistência no banco de dados. Abaixo segue o código desta classe</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/44-F-iimnvSXrgnWz54ffQwBeksLhNdJHumpe4adtm0VItfj43090JNrqnbNpuOA66n-KjeKr7eMOmEcRPQ2-JESSIX9EWEQ/06.jpg"><img class="align-full" width="750" src="http://api.ning.com:80/files/44-F-iimnvSXrgnWz54ffQwBeksLhNdJHumpe4adtm0VItfj43090JNrqnbNpuOA66n-KjeKr7eMOmEcRPQ2-JESSIX9EWEQ/06.jpg?width=750"/></a></p>
<p>Concluindo, O EntityFramework é uma ferramenta que nos ajuda a resolver alguns problemas em desenvolver códigos massantes e repetitivos para manipulação de dados Com os recursos do .net framework e da linguagem C# podemos construir classes muito eficientes como por exemplo uma classe genérica de persistência.</p>
<p> </p>
<p><strong>Arquivos usados</strong></p>
<p><a target="_self" href="http://api.ning.com:80/files/kiYqABqbUFV1PqCskofBUtgAbiJ1GpTMwZkutAE3zFMkmkkuw7Rc3k9Sbro1s*bF*hGuwmz6OGTKCXIQa9yN8Bti4x6lLuEA/IEntity.cs">IEntity.cs</a></p>
<p><a target="_self" href="http://api.ning.com:80/files/tnwGGYGKtwH9C-l5YbMWBRMHOGHdnR37wTRl7qGqoDFDp0XotNw209BVEPh01-EXbVTCUIpzIcJvUyjJO68VsVhTTiI6Bjtm/Empresa.cs">Empresa.cs</a></p>
<p><a target="_self" href="http://api.ning.com:80/files/sj309LZwHSu4fixDcxS0mrrSqvQg8wBDsSgkaleryP0UDtj4uYiU0KrurDnwOBf9CnaSY9RTd6f9v0NK4nEsBP*xNer8z89d/IRepository.cs">IRepository.cs</a></p>
<p><a target="_self" href="http://api.ning.com:80/files/sj309LZwHSu4fixDcxS0mrrSqvQg8wBDsSgkaleryP0UDtj4uYiU0KrurDnwOBf9CnaSY9RTd6f9v0NK4nEsBP*xNer8z89d/IRepository.cs"></a><a target="_self" href="http://api.ning.com:80/files/k0-bEQzsz8GTB*OM05u4cXApCgj3iQfVQJRqbtSm96VPwZkt2s6oHH9dc0e16CYmXbJxXn3Kr4fuJWg9AB7PehAUgVpDBh7p/GenericRepository.cs">GenericRepository.cs</a></p>
<p><a target="_self" href="http://api.ning.com:80/files/2gU1EH3p0E2gIhlLwrpoQ4ah3Vu68Sl5yvhU22ajz2j2GhZB4i-4tXLne7xZyp-9aVPKP7N763FEispNsX7v08BTCJbLBic8/DataContext.cs">DataContext.cs</a></p>
<p> </p>
<p><strong>Para saber mais:</strong><br/> <a target="_self" href="http://devbrasil.net/group/cdesenvolvendores">Aprofunde seus conhecimentos sobre este tema na comunidade C# (Csharp)</a><br/>
<a target="_self" href="http://devbrasil.net/group/sqlserver">Aprofunde seus conhecimentos sobre este tema na comunidade SQLServer</a></p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/-Ob4MHXRw0s" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Frameworks, em alguns aspectos, são ferramentas poderosas que auxiliam no desenvolvimento, adiantando tarefas massantes e repetitivas. O EntityFramework é poderoso framework não só de persistência, mas manipulação de dados, uma vez que também tenta dar conta de outros aspectos referentes as complexas rotinas de um sistema de base de dados. Aliado aos mais potentes recursos das linguagens .net, é possível se alcançar agilidade e diminuir o custo de escrita de classes de persistência que…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/eG236fOCOsBd4OwWsXxD7dFty1t5caFA0nfY2DrPrXVCqOBHVa156HEG03WxpjHev8NHEJYbEWmOj47yGr3yVW5LXT7WHGNO/01.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:147439</feedburner:origLink></item><item><title>Appharbor: uma plataforma alternativa para publicar aplicações ASP.net</title><link>http://feedproxy.google.com/~r/devbrasil/~3/nmefqNyoR4s/2307362:BlogPost:140662</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Yan de Lima Justino</dc:creator><pubDate>Sat, 22 Oct 2011 13:30:00 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-10-22:2307362:BlogPost:140662</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Todos sabemos que o Windows Azure é uma excelente plataforma de computação em nuvem. "Com ela você desenvolve aplicações de alta disponibilidade e escalabilidade com as linguagens e ferramentas que já está acostumado a trabalhar" (MSDN). Contudo, aplicações pequenas e em processo de maturação talvez não estejam prontas para os custos ou infraestrutura desta poderosa plataforma. <a href="http://www.microsoft.com/windowsazure/pt/br/" target="_blank">No site oficial do Windows Azure</a> há uma série de orientações que guiam o desenvolvedor ao esclarecimento se sua aplicação de fato necessita do poder computacional da plataforma. Tal orientação existe para prevenir o desenvolvedor de custos desnecessários em manter uma aplicação em uma estrutura que talvez não seja compatível com seu porte.</p>
<p>É justamente visando este público, que não podem arcar com os custos de uma plataforma mais robusta, mas precisam publicar suas aplicações, que a <a href="https://appharbor.com/" target="_blank">AppHarbor</a> oferece sua plataforma de serviços escaláveis na nuvem. Para quem não conhece, <span class="hps"> </span><a href="https://appharbor.com/" target="_blank">AppHarbor</a> <span class="hps">é um</span> plataforma de serviços .<span class="hps">NET na qual</span> d<span class="hps">esenvolvedores de</span> <span class="hps">código publicam seu fonte</span> <span class="hps">usando a infraestrutura do </span><span class="hps">Git</span> <span class="hps">ou</span> <span class="hps">Mercurial. Neste post apresentaremos como criar uma aplicação na plataforma do AppHabor. </span></p>
<p> </p>
<p><strong>Primeiro passo: Criar uma conta no AppHarbor (ah tá!!!!)</strong></p>
<p><a href="http://api.ning.com:80/files/uJ5YXrME*U9Rn09cejq7toVLa4B7cQcUhnBumshDZAJLMlDIUV04eJkz4gvgdQaI9EtGf*Mc*H4hwQick95ZIIrrHogh9g8y/Imagem1.png" target="_self"><img src="http://api.ning.com:80/files/uJ5YXrME*U9Rn09cejq7toVLa4B7cQcUhnBumshDZAJLMlDIUV04eJkz4gvgdQaI9EtGf*Mc*H4hwQick95ZIIrrHogh9g8y/Imagem1.png?width=750" width="750" class="align-full"/></a></p>
<p> </p>
<p><strong>Criando uma nova de aplicação</strong></p>
<p>Confirme na sua caixa de email a criação de seu login e acesse sua conta. Ao fazer logon, vá para a área de aplicattions. Nesta área, crie uma nova aplicação.</p>
<p><a href="http://api.ning.com:80/files/xYUScHXcQyxgfzPwIl7CpjshVevWDykLEjf69LyWhZVuKSqkt4pV3tzpoloDiSmomRURhyrYuQUAVBUKD9VMRZpypwAn7O7v/Imagem2.png" target="_self"><img src="http://api.ning.com:80/files/xYUScHXcQyxgfzPwIl7CpjshVevWDykLEjf69LyWhZVuKSqkt4pV3tzpoloDiSmomRURhyrYuQUAVBUKD9VMRZpypwAn7O7v/Imagem2.png?width=750" width="750" class="align-full"/></a> Defina o nome de sua aplicação:</p>
<p><a href="http://api.ning.com:80/files/qLCbnULf4jvlCOPf0WxVN7YttL*PgVUCy33HlQvsbzrmpvhFejoP8DC5J3zpgXkF2BPAEiDlPN5giYvABcel-W4UGpFBAYPQ/Imagem3.jpg" target="_self"><img src="http://api.ning.com:80/files/qLCbnULf4jvlCOPf0WxVN7YttL*PgVUCy33HlQvsbzrmpvhFejoP8DC5J3zpgXkF2BPAEiDlPN5giYvABcel-W4UGpFBAYPQ/Imagem3.jpg?width=750" width="750" class="align-full"/></a></p>
<p><strong>Configurando e publicando aplicação</strong></p>
<p><strong><br/></strong></p>
<p>Ao confirmar a criação do aplicativo será criado o repositório git e as informações necessárias para acessá-lo.</p>
<p><strong><a href="http://api.ning.com:80/files/8y4Gp2DWOA-mXd5-2v0-7ZEvXEHgrdl-K84XykQaQOkfJ1fN82lk9q4DAn6TWkYS6*RypUV2IpZqVyoRBI5RdhAEbDL8gNVG/Imagem4.jpg" target="_self"><img src="http://api.ning.com:80/files/8y4Gp2DWOA-mXd5-2v0-7ZEvXEHgrdl-K84XykQaQOkfJ1fN82lk9q4DAn6TWkYS6*RypUV2IpZqVyoRBI5RdhAEbDL8gNVG/Imagem4.jpg?width=750" width="750" class="align-full"/></a></strong></p>
<p> </p>
<p>Configure o git seguindo os passos indicados no guia e publique seu fonte no repositório. Ao fazer isso, a página de sua aplicação apresentará a seguinte estrutura: Um histórico do versionamento e uma url para acesso da aplicação</p>
<p> </p>
<p><a href="http://api.ning.com:80/files/QSD75fZzlJDrVCmDMXXrYOthsJNncQY23JsKs73yEF8iNO2TVTlHFxUm0I6ZlcvSNXgAKQsnztYIo4gZApPjiaz0sQGWwBWY/Imagem5.jpg" target="_self"><img src="http://api.ning.com:80/files/QSD75fZzlJDrVCmDMXXrYOthsJNncQY23JsKs73yEF8iNO2TVTlHFxUm0I6ZlcvSNXgAKQsnztYIo4gZApPjiaz0sQGWwBWY/Imagem5.jpg?width=750" width="750" class="align-full"/></a></p>
<p> </p>
<p><strong>Conclusão</strong></p>
<p>Vimos neste post que <a target="_blank" href="https://appharbor.com/">AppHarbor</a> <span class="hps">é uma</span> plataforma alternativa de serviços .<span class="hps">NET na qual</span> d<span class="hps">esenvolvedores de</span> <span class="hps">código podem publicar seu fonte</span> <span class="hps">usando a infraestrutura do </span><span class="hps">Git</span> <span class="hps">ou</span> <span class="hps">Mercurial. Também apresentamos os meios de como criar uma aplicação nesta plataforma e preparar o ambiente para publicação. </span></p>
<p> </p>
<p><b>Para saber mais:</b></p>
<p><a href="https://appharbor.com/" target="_self">visite o site do AppHarbor</a></p>
<p><a href="http://www.microsoft.com/windowsazure/pt/br/" target="_blank">Visite o site oficial do Windows Azure</a></p>
<p><a target="_blank" href="http://www.desenvolvendoparaweb.net/group/aspnet" rel="nofollow">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a></p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/nmefqNyoR4s" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Todos sabemos que o Windows Azure é uma excelente plataforma de computação em nuvem. "Com ela você desenvolve aplicações de alta disponibilidade e escalabilidade com as linguagens e ferramentas que já está acostumado a trabalhar" (MSDN). Contudo, aplicações pequenas e em processo de maturação talvez não estejam prontas para os custos ou infraestrutura desta poderosa plataforma. &lt;a href="http://www.microsoft.com/windowsazure/pt/br/" target="_blank"&gt;No site oficial do Windows Azure&lt;/a&gt; há uma…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/uJ5YXrME*U9Rn09cejq7toVLa4B7cQcUhnBumshDZAJLMlDIUV04eJkz4gvgdQaI9EtGf*Mc*H4hwQick95ZIIrrHogh9g8y/Imagem1.png" length="0" type="image/png" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:140662</feedburner:origLink></item><item><title>Preenchendo um DropDownListFor em ASP.NET MVC3</title><link>http://feedproxy.google.com/~r/devbrasil/~3/3GTqZ8kXJnA/2307362:BlogPost:139521</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Yan de Lima Justino</dc:creator><pubDate>Thu, 20 Oct 2011 09:00:00 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-10-20:2307362:BlogPost:139521</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Muitas vezes precisamos carregar em um formulário (nesse caso uma view) algumas informações pertinentes à lógica do negócio a qual nosso sistema se propõe atender. Grande parte desta informação deriva de um banco de dados ou de um arquivo. Muito embora a operação de captura destes dados seja muito comum, às vezes precisamos de algo muito mais simples como , por exemplo, passar para este mesmo formulário uma pequena lista de valores imutáveis para regra de negócio. Veremos como esta operação funciona ao carregarmos um componente DropDownListFor() no Asp.net MVC3;</p>
<p> </p>
<p>Primeiramente, devemos criar uma Action onde instanciaremos nossa lista de valores. Veja o exemplo abaixo<a target="_self" href="http://api.ning.com:80/files/ZG9CMi7ypnSvcLDwpE8b09VxF2TAEBaF3khhsK27Kl6E0qx4UV-OkFWXEYZszvdBD4NnoUy-CgNPGyiynA2q2azg7mqhgUfK/Imagem1.png"><img class="align-full" width="673" src="http://api.ning.com:80/files/ZG9CMi7ypnSvcLDwpE8b09VxF2TAEBaF3khhsK27Kl6E0qx4UV-OkFWXEYZszvdBD4NnoUy-CgNPGyiynA2q2azg7mqhgUfK/Imagem1.png"/></a></p>
<p>Perceba que a instância de SelectList é atribuída a um objeto ViewBag. Perceba ainda que não há instância desse ViewBag. Isso porque ele é um Atributo Dinâmico do ASP.NET MVC3. Bem, criadas as listas devemos editar nosso CSHTML para recebe-las. Veja o outro exemplo abaixo</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/WkOxaDFpHicJgiPoMdyb4lSW*s*wijQZczqxmVGaPgMt*qcFUFssWGuu2MkJivcYISWmoztFeV0F6teCrOzxDS7l7Ajt-rAH/Imagem2.png"><img class="align-full" width="750" src="http://api.ning.com:80/files/WkOxaDFpHicJgiPoMdyb4lSW*s*wijQZczqxmVGaPgMt*qcFUFssWGuu2MkJivcYISWmoztFeV0F6teCrOzxDS7l7Ajt-rAH/Imagem2.png?width=750"/></a>Feito tudo isso teremos o seguinte resultado:<a target="_self" href="http://api.ning.com:80/files/q69gpD1pp5ECWOvoX5AaElH4MDJav*iAD6jIop22fnA69EJLJh3o9*JjaaDMhIN1DlbRKqhg7fzU5yBhQX2vjRe6R564M8ql/Imagem3.png"><img class="align-full" width="750" src="http://api.ning.com:80/files/q69gpD1pp5ECWOvoX5AaElH4MDJav*iAD6jIop22fnA69EJLJh3o9*JjaaDMhIN1DlbRKqhg7fzU5yBhQX2vjRe6R564M8ql/Imagem3.png?width=750"/></a></p>
<p>﻿</p>
<p>Pronto, aí estão nossas listas renderizadas. Nesse post vimos como construir e passar listas simples para views em ASP.NET MVC3.</p>
<p> </p>
<p><b>Para saber mais:</b></p>
<p><a href="http://www.asp.net/mvc/mvc3" target="_self">visite o site oficial do ASP.NET MV3</a></p>
<p><a href="http://www.desenvolvendoparaweb.net/group/aspnet" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/3GTqZ8kXJnA" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Muitas vezes precisamos carregar em um formulário (nesse caso uma view) algumas informações pertinentes à lógica do negócio a qual nosso sistema se propõe atender. Grande parte desta informação deriva de um banco de dados ou de um arquivo. Muito embora a operação de captura destes dados seja muito comum, às vezes precisamos de algo muito mais simples como , por exemplo, passar para este mesmo formulário uma pequena lista de valores imutáveis para regra de negócio. Veremos como esta operação…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/ZG9CMi7ypnSvcLDwpE8b09VxF2TAEBaF3khhsK27Kl6E0qx4UV-OkFWXEYZszvdBD4NnoUy-CgNPGyiynA2q2azg7mqhgUfK/Imagem1.png" length="0" type="image/png" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:139521</feedburner:origLink></item><item><title>ActionMailer.Net: Email Templates de forma simples e rápida</title><link>http://feedproxy.google.com/~r/devbrasil/~3/VtGJ980eh8I/2307362:BlogPost:136844</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Yan de Lima Justino</dc:creator><pubDate>Tue, 27 Sep 2011 19:30:00 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-09-28:2307362:BlogPost:136844</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><font size="3" face="arial, helvetica, sans-serif">Quem já teve alguma experiência com frameworks sabe que eles trazem algumas soluções bastante interessante e que auxiliam o desenvolvedor acelerando algumas rotinas repetitivas e muitas vezes enfadonhas. Uma dessas funcionalidades é o envio de email. Uma biblioteca bem conhecida é a ActionMailer. Esta biblioteca, que prover uma acesso facilitado para o envio de email template, agora está disponível para desenvolvedores .net e disponibilizada pelo NuGet. O seu uso na versão para MVC se resume nos seguintes pontos:<br/> <br/>
<strong>1) Baixe o pacote pelo Package Manager digitando o seguinte código</strong><br/>
<strong><br/>
PM&gt; Install-Package ActionMailer</strong><br/>
<br/>
<strong>2) Escreva seu controller herdando da classe MailerBase</strong><br/>
<br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">public class MailController : MailerBase</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;"><br/>
{</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">   public EmailResult VerificationEmail(Usuario model)</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">   {</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">      To.Add(model.EmailAddress);</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">      From = "no-reply@mycoolsite.com";</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">      Subject = "MyCoolSite Account Verification";</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">      return Email(model);</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;">   }</span><br/>
<span class="font-size-2" style="font-family: 'courier new', courier;"><br/>
}</span><br/>
<br/>
<strong>3) Crie sua view (cshtml) do email template como no exemplo abaixo</strong><br/>
<strong><br/>
(nome da view criada foi VerificationEmail.html.cshtml)</strong><br/>
<br/>
<span style="font-family: 'courier new', courier;">@using ActionMailer.Net</span> <br/>
<span style="font-family: 'courier new', courier;">@model Models.Usuario</span></font></p>
<p><span style="font-family: 'courier new', courier;"><font size="3" face="arial, helvetica, sans-serif">@<br/> {</font></span></p>
<p><font size="3" face="arial, helvetica, sans-serif"><span style="font-family: 'courier new', courier;">Layout = null;</span> <br/> <span style="font-family: 'courier new', courier;">}</span> <br/>
<br/>
<span style="font-family: 'courier new', courier;"><br/>
Bem-vindo, @Model.Nome</span> <br/>
<span style="font-family: 'courier new', courier;"><br/>
Precisamos que você confirme sua conta de email.</span> <br/>
<span style="font-family: 'courier new', courier;">Clique neste link para obter esta verificação!</span> <br/>
<span style="font-family: 'courier new', courier;">@Url.Action("Index", "Conta", new { chave = @Model.Codigo }, "http")</span> <br/>
<span style="font-family: 'courier new', courier;">Obrigado!</span> <br/>
<br/>
<strong>ATENÇÃO: para enviar o email como texto o arquivo cshtml deve</strong> <br/>
<strong>ser escrito da seguinte forma: &lt;nome arquivo&gt;.text.cshtml. Já para enviar como html</strong><br/>
<strong><br/>
 o arquivo deve ser salvo como: &lt;nome arquivo&gt;.html.cshtml.</strong><br/>
<br/>
<strong><br/>
 4) Chame a classe do controler</strong><br/>
<strong><br/>
Pronto! Agora é só realizar a chamada da classe do controller criado como no exemplo abaixo</strong><br/>
<br/>
<span style="font-family: 'courier new', courier;">private void EnviarEmail(Usuario usuario)</span> <br/>
<span style="font-family: 'courier new', courier;">{</span></font></p>
<p><font size="3" face="arial, helvetica, sans-serif"><span style="font-family: 'courier new', courier;">var email = new EmailController();</span> <br/> <span style="font-family: 'courier new', courier;">email.VerificationEmail(usuario).Deliver();</span> <br/>
<span style="font-family: 'courier new', courier;">}</span><br/>
<br/>
Para esclarecer melhor o uso desta biblioteca, disponibilizo o link de<br/>
uma video aula de Michel Banagouro demonstrando como implementar<br/>
esta biblioteca fantástica. Espero que aproveitem</font></p>
<p> </p>
<pre><span class="font-size-3" style="font-family: arial, helvetica, sans-serif;"><strong>Para saber mais:</strong></span><br/><span class="font-size-3" style="font-family: arial, helvetica, sans-serif;"><a target="_self" href="http://vimeo.com/21882125">Assista ao vídeo "ActionMailer.Net Uma maneira fácil de enviar email"</a></span><br/><span class="font-size-3" style="font-family: arial, helvetica, sans-serif;"><a rel="nofollow" href="http://www.desenvolvendoparaweb.net/group/aspnet" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a></span><br/></pre><img src="http://feeds.feedburner.com/~r/devbrasil/~4/VtGJ980eh8I" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;font face="arial, helvetica, sans-serif" size="3"&gt;Quem já teve alguma experiência com frameworks sabe que eles trazem algumas soluções bastante interessante e que auxiliam o desenvolvedor acelerando algumas rotinas repetitivas e muitas vezes enfadonhas. Uma dessas funcionalidades é o envio de email. Uma biblioteca bem conhecida é a ActionMailer. Esta biblioteca, que prover uma acesso facilitado para o envio de email template, agora está disponível para desenvolvedores .net e disponibilizada…&lt;/font&gt;&lt;/p&gt;                    </description><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:136844</feedburner:origLink></item><item><title>ASP.NET MVC - Templates com Razor @Sections</title><link>http://feedproxy.google.com/~r/devbrasil/~3/2-H9UxPuvWQ/2307362:BlogPost:116305</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thiago Zulato</dc:creator><pubDate>Thu, 18 Aug 2011 08:57:35 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-08-18:2307362:BlogPost:116305</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>As <em>sections</em> estão entre os principais benefícios oferecidos pelo Razor. Com muita facilidade e pouco esforço, elas permitem fornecer regiões específicas de código de dentro de uma view, para uma página layout (masterpage). Podemos criar <em>sections</em> facilmente no Razor, utilizando o bloco <em>@section</em> seguido do nome da <em>section</em>. O código a seguir mostra como definir uma <em>section</em> em uma view.</p>
<p> </p>
<p>@section nome_da_section{</p>
<p>     //seu template vai aqui...</p>
<p>}</p>
<p> </p>
<p>Para renderizar nossas <em>sections</em> na página layout, utilizaremos o método @RenderSection(). Esse método tem dois argumentos de entrada: o primeiro, é onde passamos o nome da section, que será renderizada na página e o segundo define se a section será ou não opcional. Se o segundo parâmetro for indicado como <em>true</em>, e alguma de nossas views não possuir a <em>section</em> passada no primeiro argumento, teremos um erro em runtime.<br/><br/>Para os exemplos, vou criar duas sections simples, onde a primeira irá definir um "Header" e a segunda irá definir um "Footer" para determinadas views.</p>
<p> </p>
<p>Inicie um novo projeto ASP.NET MVC 3 no visual studio 2010 navegando em "File / New / Project..." e escolha ASP.NET MVC 3 Web Application. Próximo passo é selecionar o template "Internet Application" e a view engine Razor.</p>
<p> </p>
<p>Como sabemos que nem sempre todas as views irão ter as sections definidas, vou explicar duas formas de aplicar um código padrão caso alguma view não retorne um bloco com a section.</p>
<p> </p>
<p><a href="http://api.ning.com:80/files/aW2WqjOF1OpuqR7oDjHWci4oiKUwIKT10T0KH5cmJOC9fMQ2ZobhAW-gzEUs1YZUa1vx7MVLx8pHspjkEkjbQubg9yLikRvj/Index_cshtml_sections.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/aW2WqjOF1OpuqR7oDjHWci4oiKUwIKT10T0KH5cmJOC9fMQ2ZobhAW-gzEUs1YZUa1vx7MVLx8pHspjkEkjbQubg9yLikRvj/Index_cshtml_sections.jpg?width=589" width="589"/></a></p>
<p style="text-align: center;">Figura 1 - Página Index.cshtml com as sections Header e Footer definidas.</p>
<p> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/*NPXhiVWziXw4nGsRzqwMnIbcRGWUl7PIDilHs9D6P1OMkuaEaMmkgK84sB3CWAEYMDJdPNu*HFTeuiUQigo2f7ih2IQN4EZ/layout_cshtml_sections.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/*NPXhiVWziXw4nGsRzqwMnIbcRGWUl7PIDilHs9D6P1OMkuaEaMmkgK84sB3CWAEYMDJdPNu*HFTeuiUQigo2f7ih2IQN4EZ/layout_cshtml_sections.jpg?width=511" width="511"/></a>Figura 2 - Utilizando @RenderSection() para renderizar as section na página de layout.</p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/7P3DwULsh*QWMV5RIqe2AsEEb-ouldGJSWibHJmBdRAVZ60bguCNWyJQshCo4ESgbU3hDwUCqW6Tt0970xTT58PVZmhn0zww/resultado_final.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/7P3DwULsh*QWMV5RIqe2AsEEb-ouldGJSWibHJmBdRAVZ60bguCNWyJQshCo4ESgbU3hDwUCqW6Tt0970xTT58PVZmhn0zww/resultado_final.jpg?width=592" width="592"/></a>Figura 3 - Sections renderizadas na página layout.</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;">Até aqui, tudo bem, definimos a view Index.cshtml com nossas sections e rederizamos com o @RenderSection. Como eu disse logo acima, nem sempre todas as views terão as <em>sections</em> "Header" e "Footer" definidas, e nesse caso, queremos definir um valor padrão.<br/><br/><strong><span class="font-size-3">Definir valor padrão para as sections.</span></strong><br/><br/><strong><span class="font-size-3">Opção 1: Usar o método IsSectionDefined() </span></strong></p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2">Esse método, recebe o nome da section como argumento de entrada e retorna <em>true/false</em> para indicar se alguma section com o nome passado, foi definido na view que está sendo renderizada no método @RenderBody.</span></p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><span style="font-size: 11px;" class="font-size-2"><a href="http://api.ning.com:80/files/2bmZ7rAoYlFvBjKZA4x2xwyOkejDXh6oCoigKJKZN79AzUP-S-vPb1FDcPZ8ZChlr*4zWpQziyL8UpAkju3jLqr8jXlkg6E6/optional_section_option_one.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/2bmZ7rAoYlFvBjKZA4x2xwyOkejDXh6oCoigKJKZN79AzUP-S-vPb1FDcPZ8ZChlr*4zWpQziyL8UpAkju3jLqr8jXlkg6E6/optional_section_option_one.jpg?width=464" width="464"/></a>Figura 4 - Verificar se a section foi definida na view.</span></p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><span style="font-size: 11px;" class="font-size-2"><a href="http://api.ning.com:80/files/lpvSitEC2uMLvUDDw4Zoo1A1aQ7b2kcJszymIWB44S-hPywiIZ2tw3fD9VqUXHxuoGWT2ttQfh3pSR4PQ5UzaA__/resultado_section_option_one.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/lpvSitEC2uMLvUDDw4Zoo1A1aQ7b2kcJszymIWB44S-hPywiIZ2tw3fD9VqUXHxuoGWT2ttQfh3pSR4PQ5UzaA__/resultado_section_option_one.jpg?width=561" width="561"/></a>Figura 5 - Página About.cshtml sem as sections "Header" e "Footer".</span></p>
<p style="text-align: center;"> </p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2">Bom, não tem nada de errado com os exemplos acima, porém ainda fica "feio" sujar o código com esses blocos "if". Vamos para a segunda opção.</span></p>
<p><br/><strong><span class="font-size-3">Opção 2: Razor inline templates</span></strong></p>
<p> </p>
<p>O Razor fornece uma maneira de passarmos um resultado HTML como template para dentro de uma função. Para fazer isso vamos utilizar um delegate (Func&lt;T, TResult&gt;), disponível na biblioteca do .net, para escrever nosso template. Podemos facilmente criar um Razor template em qualquer view utilizando o bloco @ { //... }, porém fazendo isso, não poderemos reutilizar o template em outras páginas. Como não é isso que queremos, vou utilizar <a href="http://msdn.microsoft.com/en-us/library/bb383977.aspx" target="_blank">Extension Methods</a> para expor esse template para todas minhas páginas.</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2">Vou criar uma nova classe, que irá se chamar<em> SectionExtension,</em> com um único método, que será chamado de <em>RenderSection</em>. Fazendo isso, irei criar mais um <em>overload</em> do método @RenderSection. </span></p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2"><br/></span></p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2">Quando as views são compiladas, o Razor gera classes que são herdadas de <em>System.Web.Mvc.WebViewPage</em> e, a classe <em>WebViewPage</em>, por sua vez, herda de <em>WebPageBase</em>. Esse é o motivo de passar o tipo <em>WebPageBase</em> para meu Extension Method. Dessa maneira todas minhas páginas poderão usar o template.</span></p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><span style="font-size: 11px;" class="font-size-2"><a href="http://api.ning.com:80/files/a5Q*khBc6EhKrhICLCX1QvI*KtGLqqHlPrgb2U1BY5zXQXp3aR31eSmcbF2VrfAcjXBEzbmaag2smnYnHe5QJR66vPNShJ55/classe_extension.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/a5Q*khBc6EhKrhICLCX1QvI*KtGLqqHlPrgb2U1BY5zXQXp3aR31eSmcbF2VrfAcjXBEzbmaag2smnYnHe5QJR66vPNShJ55/classe_extension.jpg?width=568" width="568"/></a>Figura 6 - Criando um novo método para expor o template para as páginas.</span></p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><span style="font-size: 11px;" class="font-size-2"><a href="http://api.ning.com:80/files/Ht8YZ2sbhDQD1W5HO9-YYVBcpJjdxkoZnt8cL8P8t1UO3sRHbXB29-qFN5GJRQ79v8kXyJbOGtb-LQcX0iF87Z0ZVJ--i-eH/resultado_opcao_two.jpg" target="_self"><img class="align-center" src="http://api.ning.com:80/files/Ht8YZ2sbhDQD1W5HO9-YYVBcpJjdxkoZnt8cL8P8t1UO3sRHbXB29-qFN5GJRQ79v8kXyJbOGtb-LQcX0iF87Z0ZVJ--i-eH/resultado_opcao_two.jpg?width=500" width="500"/></a>Figura 7 - Renderizando as sections com o <em>overload</em> do <em>RenderSection</em>.</span></p>
<p style="text-align: center;"> </p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2">Agora, qualquer @Html passado no segundo argumento será renderizado como código padrão, caso alguma view não tenha as sections definidas em seu layout.</span></p>
<p style="text-align: left;"> </p>
<p><strong><span class="font-size-3">Conclusão</span></strong></p>
<p> </p>
<p>Com a utilização das <em>sections</em>, podemos facilitar e muito o desenvolvimento de aplicações ASP.NET MVC. Esse é mais um poderoso recurso que o Razor nos oferece, simples de implementar, flexível, mantém nosso código limpo e é algo trivial também.</p>
<p> </p>
<p><strong>Para saber mais:</strong><br/><br/><a href="http://devbrasil.net/group/aspnet" target="_blank">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a></p>
<p style="text-align: left;"><span style="font-size: 11px;" class="font-size-2"><br/></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/2-H9UxPuvWQ" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;As &lt;em&gt;sections&lt;/em&gt; estão entre os principais benefícios oferecidos pelo Razor. Com muita facilidade e pouco esforço, elas permitem fornecer regiões específicas de código de dentro de uma view, para uma página layout (masterpage). Podemos criar &lt;em&gt;sections&lt;/em&gt; facilmente no Razor, utilizando o bloco &lt;em&gt;@section&lt;/em&gt; seguido do nome da &lt;em&gt;section&lt;/em&gt;. O código a seguir mostra como definir uma &lt;em&gt;section&lt;/em&gt; em uma view.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;@section nome_da_section{&lt;/p&gt;
&lt;p&gt;     //seu…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/aW2WqjOF1OpuqR7oDjHWci4oiKUwIKT10T0KH5cmJOC9fMQ2ZobhAW-gzEUs1YZUa1vx7MVLx8pHspjkEkjbQubg9yLikRvj/Index_cshtml_sections.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:116305</feedburner:origLink></item><item><title>ASP.NET MVC com Razor View Engine</title><link>http://feedproxy.google.com/~r/devbrasil/~3/2iAUYao_8ug/2307362:BlogPost:113751</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Thiago Zulato</dc:creator><pubDate>Tue, 09 Aug 2011 19:46:40 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-08-10:2307362:BlogPost:113751</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>Desde que a engine do Razor surgiu com o ASP.NET MVC, ganhou grande popularidade com sua simplicidade e o seu poder. O principal objetivo do Razor é manter o código de nossas views mais limpo, simples de entender e, é claro, facilitar no momento da manutenção. Não é necessário aprender uma nova linguagem, pois o Razor é inteligente o suficiente para saber se o código foi escrito em C#, VB ou até mesmo Html.<br/> <br/>
No exemplo de código abaixo, fica evidente o quanto é confortável a leitura de páginas com Razor no lugar daquele monte de caracteres poluindo as tags Html.</p>
<p><a target="_self" href="http://api.ning.com:80/files/1sJhi5SSZ5Ff59UirmEmFDNJ9V--oG*b07EvMFCQhBZEhu20TV2Q8T0R4xMEyKJg2-ZKuMxHhvt-s8OLobqp0kLqHqQkg6*C/razor_aspx_engine.jpg"><img class="align-left" width="360" src="http://api.ning.com:80/files/1sJhi5SSZ5Ff59UirmEmFDNJ9V--oG*b07EvMFCQhBZEhu20TV2Q8T0R4xMEyKJg2-ZKuMxHhvt-s8OLobqp0kLqHqQkg6*C/razor_aspx_engine.jpg"/></a></p>
<p> </p>
<p> </p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"> </p>
<p style="text-align: center;">Figura 1 - Exemplo Razor x ASPX engine.</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">Se repararmos no código acima, ao invés de digitar 5 caracteres (&lt;%=%&gt;), digitamos apenas 1 (@).</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><strong><span class="font-size-3">Criando nossa aplicação com Razor engine</span></strong></p>
<p style="text-align: left;"><strong><span class="font-size-3"><br/></span></strong></p>
<p style="text-align: left;">Vou criar um novo projeto ASP.NET MVC 3, utilizando o template <em>Internet Application</em>.</p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><a target="_self" href="http://api.ning.com:80/files/Xq5fUfkzANl3EVYPVmU7sxJxWOpH9zuxyTqRgE1uTqqhMPrOLsUw4fPOH7-7Ks7--ENSxuF0UN-1pFl2yKeogg-n2ha65X1A/criando_novo_projeto.jpg"><img class="align-center" width="500" src="http://api.ning.com:80/files/Xq5fUfkzANl3EVYPVmU7sxJxWOpH9zuxyTqRgE1uTqqhMPrOLsUw4fPOH7-7Ks7--ENSxuF0UN-1pFl2yKeogg-n2ha65X1A/criando_novo_projeto.jpg?width=500"/></a></p>
<p style="text-align: center;">Figura 2 - Criando uma aplicação ASP.NET MVC 3 Web Application.</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">A seguir, vamos configurar nosso projeto escolhendo o template e a view engine. O modelo <em>Internet Application</em> já vem com alguns exemplos de Controllers, Models e Views.</p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/1sJhi5SSZ5HTwE2IvjjoR9tFvLXWEWlQTUCT3GSXJThdFUw9pEkNzoBtO3GXZA*Qrzk23HvchY57JWT7-j0W2Xn66iLSETDA/configurando_viewengine.jpg" target="_self"><img src="http://api.ning.com:80/files/1sJhi5SSZ5HTwE2IvjjoR9tFvLXWEWlQTUCT3GSXJThdFUw9pEkNzoBtO3GXZA*Qrzk23HvchY57JWT7-j0W2Xn66iLSETDA/configurando_viewengine.jpg?width=440" width="440" class="align-center"/></a>Figura 3 - Configurando a view engine e o template.</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">Agora com o projeto criado, vou criar uma classe (UsuarioModels) para representar meu modelo, um controller (UsuarioController) simples para passar os dados para minha view e vou criar também uma view para representar esses dados na interface do usuário. </p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/rDoRnF3ya62W70ArIervowVDvKlU0mRbhko4BR3IEEq8lWPZr2slPugdEOHkWr-LsakC2jzdBRNtOxAtIwv8-U2w6vurjCUX/Models_Controller.jpg" target="_self"><img src="http://api.ning.com:80/files/rDoRnF3ya62W70ArIervowVDvKlU0mRbhko4BR3IEEq8lWPZr2slPugdEOHkWr-LsakC2jzdBRNtOxAtIwv8-U2w6vurjCUX/Models_Controller.jpg?width=394" width="394" class="align-center"/></a>Figura 4 - Model e Controller </p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">Se repararmos na classe que representa nosso Modelo, estou utilizando <a href="http://msdn.microsoft.com/en-us/library/dd901590(v=vs.95).aspx" target="_blank">DataAnnotations</a> para definir como meus dados serão validados e apresentados na interface do usuário.</p>
<p style="text-align: left;">Criado o model e o controller, o próximo passo é criar a view para representar os dados do nosso modelo. Para criar a view, posicione o cursor do mouse sobre o nome da <em>Action Index()</em>, clique com o botão direito e selecione a opção <em>Add View...</em></p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><em><a target="_self" href="http://api.ning.com:80/files/ZqYVBu2Br2hBsQJfUqyQgr9FvPROJ0Mq4QS5zFijAgOmWuxMNuAxykbQnPEkvJiIU5WOW6YMN5ZWSi8gdxdqDwZojEbnpQOk/criando_view.jpg"><img class="align-center" width="512" src="http://api.ning.com:80/files/ZqYVBu2Br2hBsQJfUqyQgr9FvPROJ0Mq4QS5zFijAgOmWuxMNuAxykbQnPEkvJiIU5WOW6YMN5ZWSi8gdxdqDwZojEbnpQOk/criando_view.jpg?width=512"/></a></em>Figura 5 - Criando a view para representar o UsuarioModels</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">Após clicar em Add View..., a IDE do visual studio irá apresentar a tela para configuração da nossa view. O nome da view continuará igual o nome da <em>Action</em>, que foi definido como <em>Index()</em>. Selecione o Razor (CSHTML - C# ou VBHTML - VB) como a view engine. Como iremos criar nossa interface baseada no modelo da classe UsuarioModels, vamos marcar a opção <em>Create a strongly-typed view</em>, para que possamos selecionar em <em>Model class</em> nosso modelo.</p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/SaZ94IumzHvy-SYn0WLUW9MvRj7AdGZEgoNVjT5akgbo36d3otLs3qihS2fYLGlLqBjKr83PYvsgqanQ2s3*whU6Y4lbXEZ3/add_view.jpg" target="_self"><img src="http://api.ning.com:80/files/SaZ94IumzHvy-SYn0WLUW9MvRj7AdGZEgoNVjT5akgbo36d3otLs3qihS2fYLGlLqBjKr83PYvsgqanQ2s3*whU6Y4lbXEZ3/add_view.jpg?width=353" width="353" class="align-center"/></a>Figura 6 - Configurando a View</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">Próximo passo, é clicar em Add e conferir a View Index.cshtml que foi gerada. Reparem que o código é muito simples, sem sujeiras e fica muito fácil de ler. Podemos também, fazer qualquer formatação em nossa tela, assim como faríamos com o C# em webforms.</p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/P8jkOfy2YxyXGpslcfmFAmtZPe9lK2s8ObTLV06QZAxNwr1uCegn*aqTTcszaCdzIbgboqgZpRdRqwbEgqRA4L8gnJ14kzCK/template_view.jpg" target="_self"><img src="http://api.ning.com:80/files/P8jkOfy2YxyXGpslcfmFAmtZPe9lK2s8ObTLV06QZAxNwr1uCegn*aqTTcszaCdzIbgboqgZpRdRqwbEgqRA4L8gnJ14kzCK/template_view.jpg?width=382" width="382" class="align-center"/></a>Figura 7 - Código gerado pela view engine</p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/5rwnszxcv8Wn7f9YdPZVq*16Bdi*pfIJrVAGWHpNJ4Srbb6If*pl1BLYw03VEpcOvtVSUXACRiizAYBVWrYm09pKUQcMQLpk/format_view.jpg" target="_self"><img src="http://api.ning.com:80/files/5rwnszxcv8Wn7f9YdPZVq*16Bdi*pfIJrVAGWHpNJ4Srbb6If*pl1BLYw03VEpcOvtVSUXACRiizAYBVWrYm09pKUQcMQLpk/format_view.jpg?width=539" width="539" class="align-center"/></a>Figura 8 - Formatando datas na view</p>
<p style="text-align: center;"> </p>
<p style="text-align: center;"><a href="http://api.ning.com:80/files/GE-psZxNW07wQBgybpH9QUpqgKld4StvsNbeGM8NzE7lQKUIPRDmBJHacNJCgoelV6vnwL4Fawp76TrivthB*wS-9XlV6Ro1/resultado.jpg" target="_self"><img src="http://api.ning.com:80/files/GE-psZxNW07wQBgybpH9QUpqgKld4StvsNbeGM8NzE7lQKUIPRDmBJHacNJCgoelV6vnwL4Fawp76TrivthB*wS-9XlV6Ro1/resultado.jpg?width=600" width="600" class="align-center"/></a></p>
<p style="text-align: center;">Figura 9 - Resultado final com Razor</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;">Podemos utilizar também, em nossas views, diferentes blocos de código razor para declarar variáveis e funções. Para declarar variáveis, utilizamos o bloco @{ //...} já criado com a view e para declarar funções, utilizamos o bloco @functions { //... }.</p>
<p style="text-align: left;"> </p>
<p style="text-align: center;"><a target="_self" href="http://api.ning.com:80/files/fGEQXDqagVi6pjqh7sWRDsFPWMIbtVQO235GUn-0CK2B6POJh40t*hF2mTQ2c4MwQ2VBMGBnKc0gE7rrU07LWOaz8yyQI6y-/var_functions_razor.jpg"><img class="align-center" width="382" src="http://api.ning.com:80/files/fGEQXDqagVi6pjqh7sWRDsFPWMIbtVQO235GUn-0CK2B6POJh40t*hF2mTQ2c4MwQ2VBMGBnKc0gE7rrU07LWOaz8yyQI6y-/var_functions_razor.jpg"/></a>Figura 10 - Variáveis e Funções declaradas na view com blocos de código Razor</p>
<p style="text-align: center;"> </p>
<p style="text-align: left;"><strong><span class="font-size-3">Conclusão</span></strong></p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span class="font-size-2">Pudemos ver aqui todo poder, simplicidade e flexibilidade que o razor oferece no desenvolvimento de aplicações ASP.NET MVC.</span></p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span class="font-size-2">Espero que esse artigo seja útil para aqueles que desejam iniciar os estudos em ASP.NET MVC com Razor.</span></p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span class="font-size-2">Muito Obrigado.</span></p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span class="font-size-2">Conheça também outros artigos relacionados a comunidade:</span></p>
<p style="text-align: left;"><span class="font-size-2"><a target="_self" href="http://devbrasil.net/group/aspnet">Comunidade ASP.NET</a></span></p>
<p style="text-align: left;"><span class="font-size-2"><a target="_self" href="http://devbrasil.net/group/cdesenvolvendores">Comunidade C#</a></span></p>
<p style="text-align: left;"><span class="font-size-2"><a target="_self" href="http://devbrasil.net/profiles/blogs/configurando-uma-viewengine-no">Configurando uma ViewEngine no ASP.NET MVC</a><br/></span></p>
<p style="text-align: left;"> </p>
<p style="text-align: left;"><span class="font-size-2"><br/></span></p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/2iAUYao_8ug" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;Desde que a engine do Razor surgiu com o ASP.NET MVC, ganhou grande popularidade com sua simplicidade e o seu poder. O principal objetivo do Razor é manter o código de nossas views mais limpo, simples de entender e, é claro, facilitar no momento da manutenção. Não é necessário aprender uma nova linguagem, pois o Razor é inteligente o suficiente para saber se o código foi escrito em C#, VB ou até mesmo Html.&lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; No exemplo de código abaixo, fica evidente o quanto é confortável a…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/1sJhi5SSZ5Ff59UirmEmFDNJ9V--oG*b07EvMFCQhBZEhu20TV2Q8T0R4xMEyKJg2-ZKuMxHhvt-s8OLobqp0kLqHqQkg6*C/razor_aspx_engine.jpg" length="0" type="image/jpeg" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:113751</feedburner:origLink></item><item><title>Crud com entity Framework fácil Atualizado</title><link>http://feedproxy.google.com/~r/devbrasil/~3/YdjYQA0TpsA/2307362:BlogPost:109118</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Paulo Henrique Menezes</dc:creator><pubDate>Mon, 18 Jul 2011 17:30:00 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-07-19:2307362:BlogPost:109118</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p>O <strong>Entity Framework 4</strong> é o framework ORM da Microsoft que transforma objetos de negócio em dados relacionais e vice-versa. O foco do <strong>Entity Framework</strong> não é o banco de dados mas o modelo de negócios e dessa forma uma de suas tarefas e gerar o modelo conceitual a partir do modelo de banco de dados, feito este serviço o desenvolvedor não tem que lidar mais diretamente com o banco de dados mas com o modelo conceitual e o modelo de entidades.</p>
<p>Tenho visto muitos tutoriais ensinando o CRUD, mas de forma complicada, colocando muito código desnecessário para o iniciante, sendo assim, dificultando o aprendizado do mesmo.</p>
<p> </p>
<p>O objetivo do artigo é mostrar como é feito o Insert, update e delete usando EF.</p>
<p>Abaixo a nossa tela utilizada. Bem simples para poder entender. Lembrando que essa tela e o ORM foram criados nesse artigo</p>
<p>Primeiro você deve criar um novo projeto do tipo Web Project.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/4OZZbIrO04wtH5qprA6vPmZsfhW0FSmWtBpD7NnJmblozXgc2zwwaswF3LGcGFuAHWrEWGVsOacIgs4Ew0ZperqoZ6tpNrEp/untitled.bmp"><img width="300" src="http://api.ning.com:80/files/4OZZbIrO04wtH5qprA6vPmZsfhW0FSmWtBpD7NnJmblozXgc2zwwaswF3LGcGFuAHWrEWGVsOacIgs4Ew0ZperqoZ6tpNrEp/untitled.bmp" class="align-center"/></a></p>
<p> </p>
<p>Chamaremos esse projeto de CRUD. Apenas para não ficar muito extenso, mas você pode escolher o nome que quiser.</p>
<p>Depois que o visual studio criar o projeto, você deve adicionar um novo webform. Clicando em cima do projeto e adicionando um webforme usando master page. Chamaremos esse form de Cadastro.aspx</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/YN3uH777WAIgmrNgCN-RGyOTpAU9Smt9yz9w1F38Z662XYUxXwWCToXOTWr8bwjZD4hUbfXXcxZxsfK2aLsNHEEfj9LHveGC/untitled2.bmp"><img width="750" src="http://api.ning.com:80/files/YN3uH777WAIgmrNgCN-RGyOTpAU9Smt9yz9w1F38Z662XYUxXwWCToXOTWr8bwjZD4hUbfXXcxZxsfK2aLsNHEEfj9LHveGC/untitled2.bmp?width=750" class="align-center"/></a></p>
<p> </p>
<p>Depois de criado o webForm, vamos adicionar um menu Cadastro no nosso projeto.</p>
<p>Clique em Site.Master.</p>
<p>Adiciona a seguinte linha de código no projeto:</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/KAaYtDnuTEkB2uvfa7T*0C48VUPfHjuNAobPzZ5BxavVsTYV1deQcf7hEeV41Tig5DHI0MmuI-Je7x54-vx-QCDlfrF0HP2Z/untitled8.bmp"><img width="631" src="http://api.ning.com:80/files/KAaYtDnuTEkB2uvfa7T*0C48VUPfHjuNAobPzZ5BxavVsTYV1deQcf7hEeV41Tig5DHI0MmuI-Je7x54-vx-QCDlfrF0HP2Z/untitled8.bmp" class="align-center"/></a></p>
<p> </p>
<p>Depois de acrescentar o nosso código podemos ver como ficou o nosso layout principal.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/iDV9E-FRGg4rP6oavfDE7z*yI2TmgkYs9grsaALBDgJqT0tTXxQaRb4YYclDT0fenHBo-l2HibAruUphJsfTY7ZI5PECd856/untitled3.bmp"><img width="422" src="http://api.ning.com:80/files/iDV9E-FRGg4rP6oavfDE7z*yI2TmgkYs9grsaALBDgJqT0tTXxQaRb4YYclDT0fenHBo-l2HibAruUphJsfTY7ZI5PECd856/untitled3.bmp" class="align-center"/></a></p>
<p> </p>
<p>Com o nosso menu pronto, agora vamos adicionar um modelo de dados entity.</p>
<p>Clique com o botão direito no projeto e adicione um novo item:</p>
<p>Chamaremos o model de modelo para ficar mais fácil.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/4OZZbIrO04xoAW-5apIgYNrvzuCMVCCtwjAtVtwTXUOxeTeA5lrkLO-cIp3EjItY7owA7RvcdW*vnNo*WI5ranSyjSwy3iV0/untitled4.bmp"><img width="300" src="http://api.ning.com:80/files/4OZZbIrO04xoAW-5apIgYNrvzuCMVCCtwjAtVtwTXUOxeTeA5lrkLO-cIp3EjItY7owA7RvcdW*vnNo*WI5ranSyjSwy3iV0/untitled4.bmp" class="align-center"/></a></p>
<p>Após escolher o nome o Visual Studio vai pedir para escolher uma base de dados existente ou um empty model. Vamos escolher o empty model.</p>
<p>Com o ORM aberto adicione uma nova entidade conforme a figura. Coloquei uma tabela bem simples.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/QHO-ed-E7o5FFc6GgndOJOD6yiyU*ZAk9aVjc-heq8WaGZRuE6kaT6rkqKeBqzJ*B9P7djLNOlQZ6lRdpBhBYUOZhvCvo2FG/untitled5.bmp"><img width="300" src="http://api.ning.com:80/files/QHO-ed-E7o5FFc6GgndOJOD6yiyU*ZAk9aVjc-heq8WaGZRuE6kaT6rkqKeBqzJ*B9P7djLNOlQZ6lRdpBhBYUOZhvCvo2FG/untitled5.bmp" class="align-center"/></a></p>
<p> </p>
<p>Depois de criado o nossa entidade, vamos gerar um script sql para criar o nosso banco de dados. Clique com o botão direito do mouse no modelo e escolha Generate Database from Model.</p>
<p>O Visual Studio vai mostra uma tela para escolher um banco de dados. Clique em new connection. Se você tiver instalado o SQL Server Management Studio instalado, escolha o nome do servidor do mesmo, abaixo coloque o nome do banco como exemplo, como mostra a figura.</p>
<p><a target="_self" href="http://api.ning.com:80/files/4N20pw7eZDZw-p3IhIzzPTTGUYNjycEv0qdPqjrGmfUeuGD94WOXJC1rGWdlnLfR21PPr8G5voVI9M8xpjLO7-xEWRslyTr4/untitled6.bmp"><img width="300" src="http://api.ning.com:80/files/4N20pw7eZDZw-p3IhIzzPTTGUYNjycEv0qdPqjrGmfUeuGD94WOXJC1rGWdlnLfR21PPr8G5voVI9M8xpjLO7-xEWRslyTr4/untitled6.bmp" class="align-center"/></a></p>
<p> </p>
<p>Depois clique em next, espere gerar o script e depois clique em Finish.</p>
<p>Após ser gerado o script clique em Execute sql. O visual Studio vai abrir a tela SQL Server Management Studio para você escolher o servidor.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/4QM7Ceuci7o8Rehi0bQTDJZsP8FSL-daInDhC5FdHaV3aHdSol5DgGUfQgHo4bsDO-AjmIZRmpJWASBwr3np0vMzoCGKajOF/untitled7.bmp"><img width="300" src="http://api.ning.com:80/files/4QM7Ceuci7o8Rehi0bQTDJZsP8FSL-daInDhC5FdHaV3aHdSol5DgGUfQgHo4bsDO-AjmIZRmpJWASBwr3np0vMzoCGKajOF/untitled7.bmp" class="align-center"/></a></p>
<p> </p>
<p>Depois de criado no modelo de entidades e o banco de dados, vamos criar nosso formulário para criar nosso pequeno cadastro usando Entity Framework.</p>
<p>Clique em Cadastro.aspx e no modelo Source copie e cole o código abaixo:</p>
<div class="syntaxhighlighter xml" id="highlighter_224486"><div class="bar"><div class="toolbar"><div class="item copyToClipboard"><object height="16" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="16" id="highlighter_224486_clipboard"><param name="Movie" value="http://csharpbrasil.com.br/wp-content/plugins/syntaxhighlighter2/files/clipboard.swf"></param><param name="Src" value="http://csharpbrasil.com.br/wp-content/plugins/syntaxhighlighter2/files/clipboard.swf"></param><param name="WMode" value="opaque"></param><param name="Play" value="0"></param><param name="Loop" value="-1"></param><param name="Quality" value="High"></param><param name="Menu" value="0"></param><param name="AllowScriptAccess" value="never"></param><param name="Scale" value="ShowAll"></param><param name="DeviceFont" value="0"></param><param name="EmbedMovie" value="0"></param><param name="SeamlessTabbing" value="1"></param><param name="Profile" value="0"></param><param name="ProfilePort" value="0"></param><param name="AllowNetworking" value="all"></param><param name="AllowFullScreen" value="false"></param><param name="wmode" value="opaque"></param><param name="allowfullscreen" value="false"></param><param name="quality" value="High"></param><embed wmode="opaque" allowfullscreen="false" allownetworking="all" scale="ShowAll" allowscriptaccess="never" quality="High" height="16" width="16" type="application/x-shockwave-flash" id="highlighter_224486_clipboard"></embed> </object>
</div>
</div>
</div>
<div class="lines"><div class="line alt1"><table>
<tbody><tr><td class="number"><code>01</code></td>
<td class="content"><code class="xml plain">&lt;</code><code class="xml keyword">div</code> <code class="xml color1">class</code><code class="xml plain">=</code><code class="xml string">"formulario"</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>02</code></td>
<td class="content"><code class="xml plain">&lt;</code><code class="xml keyword">table</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>03</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">tr</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>04</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">td</code><code class="xml plain">&gt;Nome:&lt;/</code><code class="xml keyword">td</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>05</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">td</code><code class="xml plain">&gt;&lt;</code><code class="xml keyword">asp:TextBox</code> <code class="xml color1">ID</code><code class="xml plain">=</code><code class="xml string">"txtNome"</code> <code class="xml color1">runat</code><code class="xml plain">=</code><code class="xml string">"server"</code><code class="xml plain">&gt;&lt;/</code><code class="xml keyword">asp:TextBox</code><code class="xml plain">&gt; &lt;/</code><code class="xml keyword">td</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>06</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;/</code><code class="xml keyword">tr</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>08</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">tr</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>09</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">td</code><code class="xml plain">&gt;Email&lt;/</code><code class="xml keyword">td</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>10</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">td</code><code class="xml plain">&gt;&lt;</code><code class="xml keyword">asp:TextBox</code> <code class="xml color1">ID</code><code class="xml plain">=</code><code class="xml string">"txtEmail"</code> <code class="xml color1">runat</code><code class="xml plain">=</code><code class="xml string">"server"</code><code class="xml plain">&gt;&lt;/</code><code class="xml keyword">asp:TextBox</code><code class="xml plain">&gt;&lt;/</code><code class="xml keyword">td</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>11</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;/</code><code class="xml keyword">tr</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>12</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>13</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">tr</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>14</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">td</code><code class="xml plain">&gt;Telefone:&lt;/</code><code class="xml keyword">td</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>15</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">td</code><code class="xml plain">&gt;&lt;</code><code class="xml keyword">asp:TextBox</code> <code class="xml color1">ID</code><code class="xml plain">=</code><code class="xml string">"txtTelefone"</code> <code class="xml color1">runat</code><code class="xml plain">=</code><code class="xml string">"server"</code><code class="xml plain">&gt;&lt;/</code><code class="xml keyword">asp:TextBox</code><code class="xml plain">&gt; &lt;/</code><code class="xml keyword">td</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>16</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;/</code><code class="xml keyword">tr</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>17</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>18</code></td>
<td class="content"><code class="xml plain">&lt;/</code><code class="xml keyword">table</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>19</code></td>
<td class="content"><code class="spaces">    </code><code class="xml plain">&lt;</code><code class="xml keyword">asp:Button</code> <code class="xml color1">ID</code><code class="xml plain">=</code><code class="xml string">"Button1"</code> <code class="xml color1">runat</code><code class="xml plain">=</code><code class="xml string">"server"</code> <code class="xml color1">Text</code><code class="xml plain">=</code><code class="xml string">"Salvar"</code> <code class="xml plain">/&gt;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>20</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>21</code></td>
<td class="content"><code class="xml plain">&lt;/</code><code class="xml keyword">div</code><code class="xml plain">&gt;</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>Com o código acima podemos ver o nosso layout.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/SWVyifL*M6ICuy2yCaf-GwI3Q-EhfAVei7DScUG-jbjBEJMRqKg0ucJ59X1AnFvZn9gJN89P-kt0dcuNZT10U9WNxCRqm-pX/untitled9.bmp"><img width="300" src="http://api.ning.com:80/files/SWVyifL*M6ICuy2yCaf-GwI3Q-EhfAVei7DScUG-jbjBEJMRqKg0ucJ59X1AnFvZn9gJN89P-kt0dcuNZT10U9WNxCRqm-pX/untitled9.bmp" class="align-center"/></a></p>
<p> </p>
<p>Clique agora em modelo.edmx e verifique o nome do nosso entity container name.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/4QM7Ceuci7oHGpuVSgjt8pHgADVbkqqF1srgapIgRsOfYoE*C0yu0LmDMFILnso8rrVQusTng2ZKthOwxh-Sk5a3-mimATY7/untitled10.bmp"><img width="300" src="http://api.ning.com:80/files/4QM7Ceuci7oHGpuVSgjt8pHgADVbkqqF1srgapIgRsOfYoE*C0yu0LmDMFILnso8rrVQusTng2ZKthOwxh-Sk5a3-mimATY7/untitled10.bmp" class="align-center"/></a></p>
<p> </p>
<p>Agora clique 2 vezes no botão salvar.</p>
<p>E adicione o seguinte código:</p>
<div class="syntaxhighlighter csharp" id="highlighter_289168"><div class="bar"></div>
<div class="lines"><div class="line alt1"><table>
<tbody><tr><td class="number"><code>01</code></td>
<td class="content"><code class="csharp plain">ModeloContainer ctx =</code> <code class="csharp keyword">new</code> <code class="csharp plain">ModeloContainer();</code><code class="csharp comments">//Para acessar as nossas entidades</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>02</code></td>
<td class="content"><code class="csharp plain">Cliente cliente =</code> <code class="csharp keyword">new</code> <code class="csharp plain">Cliente();</code><code class="csharp comments">//Tabela Cliente</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>03</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>04</code></td>
<td class="content"><code class="csharp plain">cliente.Nome = txtNome.Text;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>05</code></td>
<td class="content"><code class="csharp plain">cliente.Email = txtEmail.Text;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>06</code></td>
<td class="content"><code class="csharp plain">cliente.Telefone = txtTelefone.Text;</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>07</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>08</code></td>
<td class="content"><code class="csharp plain">ctx.AddToClienteSet(cliente);</code><code class="csharp comments">//Usamos aqui o nosso contexto para adicionar um cliente. Podemos usar tambem o ctx.AddObjetc().</code></td>
</tr>
</tbody>
</table>
</div>
<div class="line alt1"><table>
<tbody><tr><td class="number"><code>09</code></td>
<td class="content"><code class="spaces"> </code> </td>
</tr>
</tbody>
</table>
</div>
<div class="line alt2"><table>
<tbody><tr><td class="number"><code>10</code></td>
<td class="content"><code class="csharp plain">ctx.SaveChanges();</code><code class="csharp comments">//O entity não é auto-comit então devemos adicionar o savechanges.</code></td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<p>Pronto, com apenas 7 linhas de código temos acesso ao nosso banco de dados e inserindo um cliente no mesmo.</p>
<p>Salve e rode o projeto. Depois de adicionar um cliente verifique no banco para saber se o mesmo está inserido.</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/4QM7Ceuci7oSy1eD3zTuwvb9WuEgZUDI1IshkgVu4qTj4UBUAfHH8A0Lq4uyrXyLh-SckxAs7dql1H7r2w7Y-YTQb74D1A2*/untitled00.bmp"><img width="669" src="http://api.ning.com:80/files/4QM7Ceuci7oSy1eD3zTuwvb9WuEgZUDI1IshkgVu4qTj4UBUAfHH8A0Lq4uyrXyLh-SckxAs7dql1H7r2w7Y-YTQb74D1A2*/untitled00.bmp" class="align-center"/></a></p>
<p> </p>
<p> Agora adicione um botão Editar e Excluir, como mostra a figura a seguir:</p>
<p><a target="_self" href="http://api.ning.com:80/files/cNeNWCQE1Wova276yJ8xobgV0rRYhyeNdWiAaP5KvLJxcDwhYV8qdK84t4LX96mblcwQ9wWTifc*kUIdhFjtApJESe9UQSpT/Imagem1.png"><img width="215" src="http://api.ning.com:80/files/cNeNWCQE1Wova276yJ8xobgV0rRYhyeNdWiAaP5KvLJxcDwhYV8qdK84t4LX96mblcwQ9wWTifc*kUIdhFjtApJESe9UQSpT/Imagem1.png" class="align-full"/></a></p>
<p>Primeiramente criar o método para preencher o gridView.</p>
<p>Clique com o botão direito do mouse e escolha View code na pagina.</p>
<p>Galera, olha que maravilha é preencher um gridView usando EF.</p>
<p><span style="color: #3366ff;">public void PreencheGridView()</span></p>
<p><span style="color: #3366ff;">  {</span></p>
<p><span style="color: #3366ff;">          using(<code class="csharp plain">ModeloContainer ctx =</code> <code class="csharp keyword">new</code> <code class="csharp plain">ModeloContainer</code>())</span></p>
<p><span style="color: #3366ff;">          {              </span></p>
<p><span style="color: #3366ff;">              gridDados.DataSource = ctx.ClienteSet;</span></p>
<p><span style="color: #3366ff;">              gridDados.DataBind();</span></p>
<p><span style="color: #3366ff;">}        }</span></p>
<p> </p>
<p><span style="color: #ff0000;">Chame o método no Page_Load para carregar os dados.</span></p>
<p>É só isso para carregar os dados no GridView. Maravilha!</p>
<p>Aqui usamos apenas uma instancia do nosso contexto.  <code class="csharp plain">Vocês podem criar o projeto usando o nome de contexto que quiser. Estou usando outro banco com apenas 2 tipos de dados: Nome e Email.</code></p>
<p>Agora vamos ver como ficou o nosso grid de exemplo:</p>
<p><a target="_self" href="http://api.ning.com:80/files/*H0cUHKL8O1nQkyzclJl*DpUh-YGvKofU591FEfkFPGyuTKeLkYQJMm-MCbAsYFqzq-UsuKtvFr8Ztd11fS2siCafIaI0vC3/GridComDados.jpg"><img width="407" src="http://api.ning.com:80/files/*H0cUHKL8O1nQkyzclJl*DpUh-YGvKofU591FEfkFPGyuTKeLkYQJMm-MCbAsYFqzq-UsuKtvFr8Ztd11fS2siCafIaI0vC3/GridComDados.jpg" class="align-full"/></a></p>
<p>Agora clique no smartTag do gridView e clique no editColumns. Adicione um CommandField select.</p>
<p>Nas propriedades altere o nome para Editar:</p>
<p> </p>
<p><a target="_self" href="http://api.ning.com:80/files/FRI4lmbguws0MM4VzwKLBZNx*rFC*XdN1TEUoT7eahH2j4jiTJMDSL4iFrzKZx0kcKiL0lgHGNyzhSeadZyE2EOtoAFPl0bN/Editar.jpg"><img width="666" src="http://api.ning.com:80/files/FRI4lmbguws0MM4VzwKLBZNx*rFC*XdN1TEUoT7eahH2j4jiTJMDSL4iFrzKZx0kcKiL0lgHGNyzhSeadZyE2EOtoAFPl0bN/Editar.jpg" class="align-full"/></a></p>
<p>Clique em ok e veja como ficou o GridView:</p>
<p><a target="_self" href="http://api.ning.com:80/files/4A9iWZBK5c51-6wfeoLrn5j3jssEHX09xj6WB-BKtXV-uXMZ7HsPbKPNMyuMuwsLtbnnTHUnU*o9tZqeaxCHDPZsY3WImsXX/editar2.jpg"><img width="243" src="http://api.ning.com:80/files/4A9iWZBK5c51-6wfeoLrn5j3jssEHX09xj6WB-BKtXV-uXMZ7HsPbKPNMyuMuwsLtbnnTHUnU*o9tZqeaxCHDPZsY3WImsXX/editar2.jpg" class="align-full"/></a></p>
Antes, adicione um label ID acima do nome e coloque um label do lado dele sem texto. Esqueci de colocar. Coloque o nome do label para lblID.<br/>
<p>Agora clique 2 vezes no grid view para gerar o método gridDados_SelectedIndexChanged e digite o seguinte código:</p>
<p><span style="color: #3366ff;">protected void gridDados_SelectedIndexChanged(object sender, EventArgs e)</span></p>
<p><span style="color: #3366ff;">{ <span style="color: #339966;">//Este codigo vai preencher os textbox</span></span></p>
<p><span style="color: #3366ff;">            lblID.Text = gridDados.SelectedRow.Cells[1].Text;</span></p>
<p><span style="color: #3366ff;">            txtNome.Text = gridDados.SelectedRow.Cells[2].Text;</span></p>
<p><span style="color: #3366ff;">            txtEmail.Text = gridDados.SelectedRow.Cells[3].Text;</span></p>
<p><span style="color: #3366ff;">            txtTelefone.Text = gridDados.SelectedRow.Cells[4].Text;</span></p>
<p><span style="color: #3366ff;">}</span></p>
<p>Rode o projeto para testar se está tudo ok.</p>
<p><span style="color: #ff0000;">Importante: o gridview tem uma propriedade chamada DataKeyNames. acesse ela e coloque o id do cliente. Se não fizer isso vai dar erro porque ele não vai achar o id do cliente. Vá ao modelo EMDX e olhe o id da tabela(entidade).</span></p>
<p>Clique 2 vezes no botão editar e adicione o seguinte código seguinte linha:</p>
<p><span style="color: #3366ff;">protected void btnEditar_Click(object sender, EventArgs e)</span></p>
<p><span style="color: #3366ff;">{            using (<code class="csharp plain">ModeloContainer ctx =</code> <code class="csharp keyword">new</code> <code class="csharp plain">ModeloContainer</code>())</span></p>
<p><span style="color: #3366ff;">          </span> <span style="color: #3366ff;">{</span></p>
<p><span style="color: #3366ff;">               int id = 0;</span></p>
<p><span style="color: #3366ff;">              id = (int)gridDados.SelectedValue; //Aqui fazemos um cast e pegamos o id selecionado.</span></p>
<p><span style="color: #00ff00;"><span style="color: #339966;">//Criamos uma variável que recebe uma busca ao id do cliente no banco             </span></span></p>
<p><span style="color: #3366ff;">             var update = (from u in ctx.ClienteSet where u.IdCliente == id select u).FirstOrDefault();    </span></p>
<p><span style="color: #3366ff;">             update.Nome = txtNome.Text;</span></p>
<p><span style="color: #3366ff;">             update.Email = txtEmail.Text;</span></p>
<p><span style="color: #3366ff;">             update.Telefone = txtTelefone.Text;</span></p>
<p><span style="color: #3366ff;"><span style="color: #339966;">// O applyCurrentValues pede o EntitySetName e a instancia dele               </span></span></p>
<p><span style="color: #3366ff;">             ctx.ApplyCurrentValues("ClienteSet", update);//Usamos este Método para pegar os valores correntes.</span></p>
<p><span style="color: #3366ff;">                ctx.SaveChanges();              </span></p>
<p><span style="color: #3366ff;">             PreencheGridView();//Chamamos nosso método para assim que editar um dado nos mostre em tempo de execução.</span></p>
<p>           }  </p>
<p>    }</p>
<p>Rode o projeto, clique em editar para preencher os campos e depois clique no botão EDITAR para atualizar os dados.</p>
<p>Excluindo!</p>
<p>Para excluir clique em editar para preencher os campos, depois você clica em excluir. Você pode criar um commandField Select chamado excluir para selecionar o dados desejado e depois efetuar a exclusão.</p>
<p>De um duplo clique no botão excluir e adicione a seguinte linha de codigo:</p>
<p><span style="color: #3366ff;">protected void btnExcluir_Click(object sender, EventArgs e)</span></p>
<p><span style="color: #3366ff;">{</span></p>
<p><span style="color: #3366ff;">            using (<code class="csharp plain">ModeloContainer ctx =</code> <code class="csharp keyword">new</code> <code class="csharp plain">ModeloContainer</code>())</span></p>
<p><span style="color: #3366ff;">     {</span></p>
<p><span style="color: #3366ff;">                int id = 0;</span></p>
<p><span style="color: #3366ff;">                id = (int)gridDados.SelectedValue;</span></p>
<p><span style="color: #339966;">               //Procuramos pelo id</span></p>
<p><span style="color: #3366ff;">          var update = (from u in ctx.ClienteSet where u.IdCliente == id select u).FirstOrDefault();           </span></p>
<p><span style="color: #3366ff;">               ctx.DeleteObject(update);<span style="color: #339966;">// O que mudou aqui é apenas essa linha. Ela faz o delete no banco</span></span></p>
<p><span style="color: #3366ff;">                ctx.SaveChanges();</span></p>
<p><span style="color: #3366ff;">                PreencheGridView();</span></p>
<p><span style="color: #3366ff;">            }</span></p>
<p><span style="color: #3366ff;">    }</span></p>
<p>Não vamos deixar excluir direto. Vá as propriedades do botão excluir e adicione o seguinte codigo em: <span style="color: #3366ff;">onclientclick="return confirm('Deseja excluir ?')".</span></p>
<p><span style="color: #000000;">Terminamos o nosso pequeno projeto. Com isso você pode brincar e aprender mais.</span></p>
<p><span style="color: #000000;">Abraços!!</span></p>
<p>Até a próxima.</p>
<p> </p>
<p><a href="http://www.desenvolvendoparaweb.net/group/aspnet">Aprofunde seus conhecimentos sobre este tema na comunidade ASP.Net</a> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/YdjYQA0TpsA" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;O &lt;strong&gt;Entity Framework 4&lt;/strong&gt; é o framework ORM da Microsoft que transforma objetos de negócio em dados relacionais e vice-versa. O foco do &lt;strong&gt;Entity Framework&lt;/strong&gt; não é o banco de dados mas o modelo de negócios e dessa forma uma de suas tarefas e gerar o modelo conceitual a partir do modelo de banco de dados, feito este serviço o desenvolvedor não tem que lidar mais diretamente com o banco de dados mas com o modelo conceitual e o modelo de entidades.&lt;/p&gt;
&lt;p&gt;Tenho visto…&lt;/p&gt;                    </description><enclosure url="http://api.ning.com:80/files/4OZZbIrO04wtH5qprA6vPmZsfhW0FSmWtBpD7NnJmblozXgc2zwwaswF3LGcGFuAHWrEWGVsOacIgs4Ew0ZperqoZ6tpNrEp/untitled.bmp" length="0" type="image//bmp" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:109118</feedburner:origLink></item><item><title>SQL Server Compact Toolbox</title><link>http://feedproxy.google.com/~r/devbrasil/~3/eKc9DZBTzt0/2307362:BlogPost:107652</link><category>Brasil</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">João Felipe Portela [MSP]</dc:creator><pubDate>Mon, 11 Jul 2011 07:00:00 PDT</pubDate><guid isPermaLink="false">tag:devbrasil.net,2011-07-11:2307362:BlogPost:107652</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[
<p><img height="68" width="300" alt="SQL Server Compact ToolBox" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/sqlcetoolbox-300x68.png" title="SQL Server Compact ToolBox" class="alignnone size-medium wp-image-901"/><br/> <br/> O SQL Server Compact Toolbox é um add-in para o Visual Studio 2010 para manipular bases de dados SqlServer CE nas versões 3.5 SP2 e 4.0. Ele possui ótimos recursos de produtividade, como geradores de backup da estrutura e/ou dos dados, comparação entre bases de dados(DIFF), execução de scripts e gerenciamento visual da estrutura.<br/> <br/>
<a href="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox1.png"><img height="294" width="300" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox1-300x294.png" title="toolbox1" class="alignnone size-medium wp-image-902"/></a><br/>
<br/>
É possível também gerar "CREATEs" individuais por tabela.<br/>
<br/>
<a href="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox2.png"><img height="190" width="300" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox2-300x190.png" title="toolbox2" class="alignnone size-medium wp-image-903"/></a><br/>
<br/>
Além de criar bases de dados SQL Server Compact 4.0 ou migrar uma 3.5 SP2 para 4.0 com poucos cliques.<br/>
<br/>
<img height="172" width="300" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox3-300x172.png" title="toolbox3" class="alignnone size-medium wp-image-904"/><br/>
<br/>
E as conexões ficam mantidas assim como o gerenciador do próprio Visual Studio.<br/>
<br/>
<a href="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox4.png"><img height="196" width="300" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox4-300x196.png" title="toolbox4" class="alignnone size-medium wp-image-905"/></a><br/>
<br/>
De fato é uma ferramenta muito interessante e útil, que facilita muito a vida de quem manipula um banco SQL Server Compact no Visual Studio 2010. O add-in pode ser encontrado para download no <a target="_blank" href="http://sqlcetoolbox.codeplex.com/" title="CodePlex">site do CodePlex</a>.<br/>
<br/>
Para quem prefere trabalhar no SQL Server Management Studio e deseja utilizar dessas funcionalidades, a dica é o <a href="http://exportsqlce.codeplex.com/">SQL Compact Scripting Utility Project</a> que foi desenvolvido pelo mesmo autor.<br/>
<br/>
Para mais informações sobre o SQL Server Compact ToolBox visite o <a target="_blank" href="http://erikej.blogspot.com/">blog do desenvolvedor</a>.</p>
<p> </p>
<p><a target="_blank" href="http://devbrasil.net/group/sqlserver" rel="nofollow">Aprofunde seus conhecimentos e tire dúvidas sobre esse tema na comunidade SQL Server</a>.</p>
<p> </p><img src="http://feeds.feedburner.com/~r/devbrasil/~4/eKc9DZBTzt0" height="1" width="1"/>]]></content:encoded><description>
                        &lt;p&gt;&lt;img alt="SQL Server Compact ToolBox" class="alignnone size-medium wp-image-901" height="68" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/sqlcetoolbox-300x68.png" title="SQL Server Compact ToolBox" width="300"&gt;&lt;/img&gt; &lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; O SQL Server Compact Toolbox é um add-in para o Visual Studio 2010 para manipular bases de dados SqlServer CE nas versões 3.5 SP2 e 4.0. Ele possui ótimos recursos de produtividade, como geradores de backup da estrutura e/ou dos dados, comparação entre bases de dados(DIFF), execução de scripts e gerenciamento visual da estrutura.&lt;br&gt;&lt;/br&gt; &lt;br&gt;&lt;/br&gt; &lt;a href="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox1.png"&gt;&lt;img class="alignnone size-medium wp-image-902" height="294" src="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox1-300x294.png" title="toolbox1" width="300"&gt;&lt;/img&gt;&lt;/a&gt; &lt;br&gt;&lt;/br&gt;
&lt;br&gt;&lt;/br&gt;
É possível também gerar…&lt;/p&gt;                    </description><enclosure url="http://www.joaofelipe.com/wp-content/uploads/2011/07/toolbox1.png" length="0" type="image/png" /><feedburner:origLink>http://devbrasil.net/xn/detail/2307362:BlogPost:107652</feedburner:origLink></item></channel></rss>

