<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://weblogs.asp.net/utility/FeedStylesheets/atom.xsl" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en"><title type="html">Andre Baltieri - ASP.NET MVC</title><subtitle type="html" /><id>http://weblogs.asp.net/andrebaltieri/atom.aspx</id><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/default.aspx" /><link rel="self" type="application/atom+xml" href="http://weblogs.asp.net/andrebaltieri/atom.aspx" /><generator uri="http://communityserver.org" version="3.0.20510.895">Community Server</generator><updated>2011-03-27T13:35:00Z</updated><entry><title>ASP.NET MVC–Globalizando aplicações</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2012/10/09/asp-net-mvc-globalizando-aplica-231-245-es.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2012/10/09/asp-net-mvc-globalizando-aplica-231-245-es.aspx</id><published>2012-10-09T17:03:46Z</published><updated>2012-10-09T17:03:46Z</updated><content type="html">&lt;h1&gt;Introdução&lt;/h1&gt;  &lt;p&gt;O ASP.NET MVC, assim como boa parte dos produtos da Microsoft, foi criado em Inglês (Novidade hein), e sendo assim, as vezes nos deparamos com mensagens que para nossos usuários (PT-BR) não são interessantes.&lt;/p&gt;  &lt;p&gt;As validações com DataAnnotations são fáceis e simples de utilizar, mas na outra mão, temos suas mensagens de retorno, como “The field {1} is required.” e assim por diante.&lt;/p&gt;  &lt;p&gt;Neste post, abordarei algumas soluções para globalizar aplicações ASP.NET MVC sem muito esforço.&lt;/p&gt;  &lt;h1&gt;Tudo começa no Web.Config&lt;/h1&gt;  &lt;p&gt;Globalizar uma aplicação na plataforma .NET começa pela adição da TAG &lt;strong&gt;&lt;em&gt;Globalization&lt;/em&gt;&lt;/strong&gt; no arquivo de configuração &lt;strong&gt;&lt;em&gt;Web.Config&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;Esta tag possui conhecidos parâmetros:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Culture – Cultura da aplicação (PT, EU, US) &lt;/li&gt;    &lt;li&gt;uiCulture – Cultura da interface (PT-BR, EU, US) &lt;/li&gt;    &lt;li&gt;EnableClientBasedCulture - Obtém ou define um valor indicando se as propriedades Culture e UICulture devem se basear no valor do AcceptLanguage, que é enviado pelo cabeçalho do browser. &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Esta propriedade deve ser definida entre as tags &lt;strong&gt;&lt;em&gt;System.Web&lt;/em&gt;&lt;/strong&gt; no arquivo &lt;strong&gt;&lt;em&gt;Web.Config&lt;/em&gt;&lt;/strong&gt;, conforme imagem abaixo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Existem vários tutorias sobre como globalizar aplicações ASP.NET Web Forms, este é um bom exemplo: &lt;a href="http://msdn.microsoft.com/en-us/library/bz9tc508.aspx"&gt;http://msdn.microsoft.com/en-us/library/bz9tc508.aspx&lt;/a&gt;.&lt;/p&gt;  &lt;h1&gt;Globalizando decimais&lt;/h1&gt;  &lt;p&gt;Nosso primeiro desafio é globalizar números decimais, que neste caso aceitam somente ponto “.” como casa decimal, e necessitamos de vírgula “,”.&lt;/p&gt;  &lt;p&gt;A figura abaixo mostra o erro, onde é exibida uma mensagem mesmo o número estando correto (Para o padrão Brasileiro).&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image1.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb1.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Este erro pode ser contornado ao adicionar um JavaScript que extende os validation methods do jQuery, permitindo o uso de vírgula “,” ao invés de ponto “.”.&lt;/p&gt;  &lt;p&gt;Infelizmente, o site de plugins do jQuery está fora, impossibilitando o download deste script: &lt;a href="http://archive.plugins.jquery.com/node/8/release"&gt;http://archive.plugins.jquery.com/node/8/release&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Fique à vontade em baixar o arquivo do source no fim deste artigo.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image2.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb2.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Com o arquivo “&lt;strong&gt;&lt;em&gt;methods_pt.js&lt;/em&gt;&lt;/strong&gt;” incluso na pasta Scripts da aplicação, é só fazer referência ao mesmo sempre que utilizar o jQuery Unnobstrutive, como nas páginas &lt;strong&gt;&lt;em&gt;Create&lt;/em&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;em&gt;Edit&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image3.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb3.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Deste modo, já podemos utilizar decimais “abrasileirados”.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image4.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb4.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Mas ainda temos o problema da mensagem em inglês, caso um valor com “.” seja digitado.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image5.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb5.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Infelizmente, a única forma que encontrei para resolver este problema, foi mediante um regular expression, que só permite números.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image6.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb6.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Deste modo, agora temos a mensagem agora está em portugês, como definida nas anotações da propriedade.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image7.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb7.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Pronto, decimais globalizados!&lt;/p&gt;  &lt;h1&gt;Utilizando Resources com DataAnnotations&lt;/h1&gt;  &lt;p&gt;Em alguns casos, você pode querer utilizar os bones e velhos Resources, que são arquivos onde mapeamos mensagens a serem substituidas em tempo de execução, justamente para globalização de aplicações.&lt;/p&gt;  &lt;p&gt;Para este exemplo criei um arquivo chamado DataAnnotations.resx na pasta App_GlobalResources da aplicação, e nele adicionei duas strings.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image8.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb8.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A primeira chave, o “&lt;strong&gt;&lt;em&gt;LidoDoResource&lt;/em&gt;&lt;/strong&gt;” é uma palavra não reservada, que utilizarei para leitura nas anotações.&lt;/p&gt;  &lt;p&gt;Já a palavra &lt;strong&gt;&lt;em&gt;PropertyValueInvalid&lt;/em&gt;&lt;/strong&gt; é uma palavra reservada, que toda vez que um valor inválido, para uma data por exemplo, for inserido, esta mensagem será retornada.&lt;/p&gt;  &lt;p&gt;Então, no arquivo &lt;strong&gt;&lt;em&gt;Global.asax&lt;/em&gt;&lt;/strong&gt;, definimos um binder para que as requisições utilizem o &lt;strong&gt;&lt;em&gt;Resource&lt;/em&gt;&lt;/strong&gt; que criamos.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image9.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb9.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Para utilizar os resources criados nas anotações, basta utilizar as propriedades &lt;strong&gt;&lt;em&gt;ErrorMessageResourceName&lt;/em&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;em&gt;ErrorMessageResourceType&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image10.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb10.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;O resultado é que agora ele lê a mensagem direto do Resource.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image11.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb11.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image12.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb12.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;No caso do resource &lt;strong&gt;&lt;em&gt;PropertyValueInvalid&lt;/em&gt;&lt;/strong&gt;, este processo ocorre automaticamente.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image13.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb13.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://andrebaltieri.files.wordpress.com/2011/12/image14.png"&gt;&lt;img style="background-image: none; border-right-width: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="image" border="0" alt="image" src="http://andrebaltieri.files.wordpress.com/2011/12/image_thumb14.png" width="244" height="154" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Conclusão&lt;/h1&gt;  &lt;p&gt;Globalizar aplicações sempre desprenderá um esforço extra, porém temos alguns meios de minimizar isto, como mostrado neste post.&lt;/p&gt;  &lt;p&gt;A questão dos decimais no ASP.NET MVC também é algo que irrita um pouco, mas como vimos pode ser facilmente contornado com um JavaScript.&lt;/p&gt;  &lt;h1&gt;Downloads&lt;/h1&gt;  &lt;p&gt;Comecei este projeto como alguns testes para o IE7, então, por favor, desconsiderem o nome do projeto.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://files.insidedotnet.com.br/IE7Tests.zip" target="_blank"&gt;http://files.insidedotnet.com.br/IE7Tests.zip&lt;/a&gt;&lt;/p&gt;  &lt;h1&gt;Referências&lt;/h1&gt;  &lt;p&gt;Using MVC 3 with non-English Locales    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/rickandy/archive/2011/02/17/using-mvc-3-with-non-english-locales.aspx" target="_blank"&gt;http://blogs.msdn.com/b/rickandy/archive/2011/02/17/using-mvc-3-with-non-english-locales.aspx&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;How to: Set the Culture and UI Culture for ASP.NET Web Page Globalization    &lt;br /&gt;&lt;a href="http://msdn.microsoft.com/en-us/library/bz9tc508.aspx" target="_blank"&gt;http://msdn.microsoft.com/en-us/library/bz9tc508.aspx&lt;/a&gt;&lt;/p&gt; &lt;strong&gt;André Baltieri    &lt;br /&gt;MTAC – Microsoft Technical Audience Contributor     &lt;br /&gt;MSN:&lt;/strong&gt; &lt;a href="mailto:andrebaltieri@hotmail.com"&gt;andrebaltieri@hotmail.com&lt;/a&gt;  &lt;br /&gt;&lt;strong&gt;Twitter:&lt;/strong&gt; @andrebaltieri   &lt;br /&gt;&lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri" target="_blank"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;  &lt;p&gt;Inside .NET Users Group Leader    &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/" target="_blank"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9079096" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC/default.aspx" /></entry><entry><title>ASP.NET MVC 3 Global Filters</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2012/10/09/asp-net-mvc-3-global-filters.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2012/10/09/asp-net-mvc-3-global-filters.aspx</id><published>2012-10-09T17:02:10Z</published><updated>2012-10-09T17:02:10Z</updated><content type="html">&lt;div id="msgcns!FACEA65067C9322A!443" class="bvMsg"&gt;   &lt;h1&gt;Introdução&lt;/h1&gt;    &lt;p&gt;Na versão 2 do MVC temos os Filters, que são aplicados aos controllers e actions dos controllers para modificar a forma como o qual é executado. Os filtros mais conhecidos são o HandleError e o Authorize, que manipulam erros ocorridos no controller/action ou restringem acesso aos mesmos respectivamente.&lt;/p&gt;    &lt;p&gt;Nesta nova versão do MVC, teremos uma atualização que permitirá criar estes filtros de forma global, ou seja, para toda a aplicação, dentro do arquivo Global.asax.&lt;/p&gt;    &lt;h1&gt;Como tudo funcionava&lt;/h1&gt;    &lt;p&gt;Antes, para o Controller ou Action teríamos algo como no código abaixo:&lt;/p&gt;    &lt;h3&gt;     &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;       &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;         &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;// Manipula os erros&lt;/span&gt;&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; [HandleError]&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;class&lt;/span&gt; HomeController : Controller&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; {&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #008000"&gt;// Restringe o acesso somente à usuários autenticados&lt;/span&gt;&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     [Authorize]&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     {&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;         ViewData[&lt;span style="color: #006080"&gt;&amp;quot;Message&amp;quot;&lt;/span&gt;] = &lt;span style="color: #006080"&gt;&amp;quot;Welcome to ASP.NET MVC!&amp;quot;&lt;/span&gt;;            &lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     }&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; &lt;span style="color: #008000"&gt;// Manipula os erros&lt;/span&gt;&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;     [HandleError]&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; ActionResult About()&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;     {&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;     }&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

        &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt; }&lt;/pre&gt;

        &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/h3&gt;

  &lt;h1&gt;Global Filters&lt;/h1&gt;

  &lt;p&gt;Agora, no ASP.NET MVC 3, podemos globalizar estes filtros no arquivo Global.asax. Este filtro então será aplicado para &lt;strong&gt;TODOS&lt;/strong&gt; os controllers e actions. O código abaixo mostra o novo método (&lt;em&gt;RegisterGlobalFilters&lt;/em&gt;) adicionado no arquivo &lt;em&gt;Global.asax&lt;/em&gt; de uma aplicação ASP.NET MVC 3.&lt;/p&gt;

  &lt;p&gt;Podemos pensar no contexto em que temos uma aplicação onde o usuário é autenticado via &lt;strong&gt;&lt;em&gt;Single Sign On&lt;/em&gt;&lt;/strong&gt; por exemplo, e tem que acessar a aplicação já com o token de autenticação. Ou seja, a aplicação toda (Global) requer autenticação. Poderíamos adicionar no método &lt;em&gt;RegisterGlobalFilters()&lt;/em&gt; um filtro para que somente usuários autenticados acesse esta aplicação (Utilizando o &lt;em&gt;AuthorizeAttribute()&lt;/em&gt;).&lt;/p&gt;

  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
    &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;public&lt;/span&gt; &lt;span style="color: #0000ff"&gt;static&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; RegisterGlobalFilters(GlobalFilterCollection filters)&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; {&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     filters.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; HandleErrorAttribute());&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     filters.Add(&lt;span style="color: #0000ff"&gt;new&lt;/span&gt; AuthorizeAttribute());            &lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; }&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;protected&lt;/span&gt; &lt;span style="color: #0000ff"&gt;void&lt;/span&gt; Application_Start()&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; {&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     AreaRegistration.RegisterAllAreas();&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;     RegisterGlobalFilters(GlobalFilters.Filters);&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;     RegisterRoutes(RouteTable.Routes);&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

      &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt; }&lt;/pre&gt;

      &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
    &lt;/div&gt;
  &lt;/div&gt;

  &lt;p&gt;Neste caso a autenticação é externa à aplicação, pois nem mesmo o login interno estaria acessível, pois globalmente esta aplicação está protegida contra usuário não autenticados, e sendo assim, nem mesmo a URL &lt;a title="http://localhost:2055/Account/LogOn?ReturnUrl=%2f" href="http://localhost:/Account/LogOn?ReturnUrl=/"&gt;http://localhost:/Account/LogOn?ReturnUrl=%2f&lt;/a&gt; funcionaria.&lt;/p&gt;

  &lt;p&gt;Podemos também criar casos específicos para estes filtros, como por exemplo, criar um filtro global para manipular erros somente quando o &lt;em&gt;Debug&lt;/em&gt; estive habilitado e etc.. Também podemos utilizar estes filtros globais com DI (Injeção de dependência).&lt;/p&gt;

  &lt;h1&gt;Conclusão&lt;/h1&gt;

  &lt;p&gt;O novo recurso de filtros Globais permite-nos aplicar filtros para a aplicação toda de uma só vez, de forma fácil e simples, através do arquivo &lt;em&gt;Global.asax&lt;/em&gt;. Podemos também criar casos específicos para a adição de um filtro ou até mesmo manipula-lós através de Dependency Injection.&lt;/p&gt;

  &lt;h1&gt;Referências&lt;/h1&gt;

  &lt;p&gt;Scott Gu 
    &lt;br /&gt;&lt;a title="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx" href="http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx"&gt;http://weblogs.asp.net/scottgu/archive/2010/07/27/introducing-asp-net-mvc-3-preview-1.aspx&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;&amp;#160;&lt;/p&gt;

  &lt;p&gt;&lt;strong&gt;André Baltieri 
      &lt;br /&gt;MTAC – Microsoft Technical Audience Contributor 

      &lt;br /&gt;MSN:&lt;/strong&gt; &lt;a href="mailto:andrebaltieri@hotmail.com"&gt;andrebaltieri@hotmail.com&lt;/a&gt;

    &lt;br /&gt;&lt;strong&gt;Twitter:&lt;/strong&gt; @andrebaltieri 

    &lt;br /&gt;&lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri" target="_blank"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;

  &lt;p&gt;Inside .NET Users Group Leader 
    &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9079089" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author></entry><entry><title>Boas práticas na WEB (Parte 1 - DTD, META-TAG e FAVICON)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2012/10/09/boas-pr-225-ticas-na-web-parte-1-dtd-meta-tag-e-favicon.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2012/10/09/boas-pr-225-ticas-na-web-parte-1-dtd-meta-tag-e-favicon.aspx</id><published>2012-10-09T16:59:57Z</published><updated>2012-10-09T16:59:57Z</updated><content type="html">&lt;h1&gt;&lt;strong&gt;O atual mercado da Web&lt;/strong&gt;&lt;/h1&gt;  &lt;p&gt;Hoje em dia, não é tão difícil se fazer um site, qualquer um com um pouco de dedicação e com as mágicas da tecnologia abre um editor WYSIWYG (What you see is What you Get – O que você vê, é o que você tem) e consegue fazer mil maravilhas.&lt;/p&gt;  &lt;p&gt;Um ponto fraco disso tudo, é que nós, profissionais da Web sofremos com isso. Quem já não perdeu um trabalho para um “cara” que cobrava R$ 100,00 para desenvolver um Web Site?&lt;/p&gt;  &lt;p&gt;Bom, chega de choro, vamos ao que interessa.&lt;/p&gt;  &lt;h1&gt;DTDs, DOCTYPES&lt;/h1&gt;  &lt;p&gt;O Fato é que em muitos dos casos, quando se desenvolvem sites, esquecem, ou nem mesmo sabem que existe um padrão por trás disso tudo. De fato, isso não é obrigatório, mas ajuda na depuração de erros de design no seu site.&lt;/p&gt;  &lt;p&gt;Ter um site “validado” não é difícil, existem apenas algumas regras a serem seguidas, tais como:&lt;/p&gt;  &lt;p&gt;DTD – Document Type Definition: Por padrão, o Adobe Dreamweaver, Microsoft Expression Web e outros editores WYSIWYG já trazem no topo quando você cria um documento HTML. Exemplo:&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HTML&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD HTML 4.01//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/html4/strict.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HTML&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD HTML 4.01 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/html4/loose.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;HTML&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD HTML 4.01 Frameset//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/html4/frameset.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&lt;/em&gt;Nota-se que não há somente um tipo de HTML, existem vário, tais como HTML 4.01 Strict e Transitional, XHTML 1.0 Transitional entre outros.&lt;/p&gt;

&lt;p&gt;Estes tipos de HTML seguem um padrão da W3C (World Wide Web Consortium)&lt;/p&gt;

&lt;p&gt;Uma maior descrição dos tipos de DTD, pode ser encontrado aqui &lt;a href="http://www.alistapart.com/stories/doctype/"&gt;http://www.alistapart.com/stories/doctype/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As ferramentas que processam HTML (Browsers por exemplo), precisão saber qual tipo de definição ele está usando. Então é por isso que um HTML precisa especificar um DTD em seu topo.&lt;/p&gt;

&lt;p&gt;Especificar um DOCTYPE, também implica em informar ao Browser ou outras ferramentas de renderização de arquivos HTML, qual a versão do HTML está sendo utilizada, e esta é uma parte muito importante do documento.&lt;/p&gt;

&lt;p&gt;Seguindo a risca os critérios acima, teríamos como início, o seguinte modelo:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/html; charset=utf-8&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Untitled 1&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;body&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;&lt;em&gt;&lt;/em&gt;Nota-se que já na primeira linha do documento, definimos nosso DOCTYPE.&lt;/p&gt;

&lt;p&gt;Na segunda linha (&lt;em&gt;&amp;lt;html xmlns=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&amp;gt;&lt;/em&gt;), informamos o XMLNS.&lt;/p&gt;

&lt;p&gt;O XMLNS é um &lt;strong&gt;&lt;em&gt;Namespace &lt;/em&gt;&lt;/strong&gt;da própria W3C Schools, e deve sempre conter este valor.&lt;/p&gt;

&lt;p&gt;http://www.w3.org/TR/REC-xml-names/&lt;/p&gt;

&lt;p&gt;Em seguida vem o resto do documento.&lt;/p&gt;

&lt;h1&gt;META-TAGs&lt;/h1&gt;

&lt;p&gt;Outra coisa pouco usada são as META-TAGs, que servem como base para busca, identificação da página e do autor, entre outros.&lt;/p&gt;

&lt;p&gt;Veja abaixo as respectivas descrições:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/html; charset=utf-8&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;author&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Andre Baltieri - andrebaltieri@hotmail.com&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;description&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Descrição do Documento&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;keywords&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Palavra Chave 1, Palavra Chave 2 &amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Na linha 1, informamos que o conteúdo descrito em nosso documento é do tipo texto/HTML, e que o tipo de caractere utilizado em nosso documento é UTF-8 (Conjunto de caracteres que possui “Ç”, “~” entre outros.)&lt;/p&gt;

&lt;p&gt;Na linha 2, definimos o atributo “Author”, que nada mais é do que o autor do documento, coisa muito importante e pouco utilizada.&lt;/p&gt;

&lt;p&gt;Na linha 3, definimos uma breve descrição do documento, e na linha 4, adicionamos “Palavras-Chaves” ao nosso documento, item de suma importância para futuras buscas em seu web site.&lt;/p&gt;

&lt;p&gt;Sendo assim, nosso documento já foi um pouco modificado, agora ele está mais robusto e seguindo já alguns padrões.&lt;/p&gt;

&lt;h1&gt;FAVICON&lt;/h1&gt;

&lt;p&gt;Para complementar, só por curiosidade, podemos adicionar um ícone ao nosso documento, é o chamado “favicon”, ou “favorite icon”. Este ícone irá representar o documento, sendo exibido na barra de endereços do Browser, antes do endereço, ou nas abas dos navegadores, antes do título do documento.&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt; &lt;span style="color: #ff0000"&gt;rel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;shortcut icon&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Imagens/favicon.ico&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mce_href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Imagens/favicon.ico&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;image/x-icon&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;&amp;#160; &lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Rapare que usamos a tag LINK, e na propriedade REL, dizemos que ele é do tipo “SHORTCUT ICON”, algo referente aos favoritos em português.&lt;/p&gt;

&lt;p&gt;Em seguida, o atributo HREF se encarrega de informar onde o ícone se encontra, e por fim, informamos o TYPE(Tipo) do arquivo, que é uma imagem, por isso usa-se “image/x-icon”.&lt;/p&gt;

&lt;p&gt;Bom, neste exato momento, temos o seguinte modelo:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;!&lt;/span&gt;&lt;span style="color: #800000"&gt;DOCTYPE&lt;/span&gt; &lt;span style="color: #ff0000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;PUBLIC&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;-//W3C//DTD XHTML 1.0 Transitional//EN&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;html&lt;/span&gt; &lt;span style="color: #ff0000"&gt;xmlns&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;http://www.w3.org/1999/xhtml&amp;quot;&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;Minha Página&lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;title&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt; &lt;span style="color: #ff0000"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;CSS/Estilos.css&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mce_href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;CSS/Estilos.css&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;rel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;stylesheet&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/css&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;link&lt;/span&gt; &lt;span style="color: #ff0000"&gt;rel&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;shortcut icon&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Imagens/favicon.ico&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;mce_href&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Imagens/favicon.ico&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;type&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;image/x-icon&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;http-equiv&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Content-Type&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;text/html; charset=utf-8&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;author&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Andre Baltieri - andrebaltieri@hotmail.com&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;description&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Breve Descrição da Página&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: white; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;     &lt;span style="color: #0000ff"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #800000"&gt;meta&lt;/span&gt; &lt;span style="color: #ff0000"&gt;name&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;keywords&amp;quot;&lt;/span&gt; &lt;span style="color: #ff0000"&gt;content&lt;/span&gt;&lt;span style="color: #0000ff"&gt;=&amp;quot;Algumas palavras chaves para buscas&amp;quot;&lt;/span&gt; &lt;span style="color: #0000ff"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0px; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &amp;#39;Courier New&amp;#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; &lt;span style="color: #0000ff"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color: #800000"&gt;head&lt;/span&gt;&lt;span style="color: #0000ff"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;

    &lt;p&gt;&lt;!--CRLF--&gt;&lt;/p&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;h1&gt;VALIDANDO SEU HTML&lt;/h1&gt;

&lt;p&gt;Uma aplicação interessante, é o validador de HTML da W3C. Ele valida todo o HTM, e aponta se existem TAGs erradas ou que não seguem os padrões.&lt;/p&gt;

&lt;p&gt;Alguns editores WYSIWYG já possuem um validar, que em tempo de execução apontam falhas em seu código HTML. Por via de dúvidas, aqui fica o LINK:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://validator.w3.org/check"&gt;http://validator.w3.org/check&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Só é preciso enviar o HTML, ou informar a URL do mesmo para que seja validado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;
    &lt;br /&gt;André Baltieri 

    &lt;br /&gt;MTAC – Microsoft Technical Audience Contributor 

    &lt;br /&gt;MSN:&lt;/strong&gt; andrebaltieri@hotmail.com | &lt;strong&gt;Twitter:&lt;/strong&gt; 

  &lt;br /&gt;@andrebaltieri 

  &lt;br /&gt;&lt;strong&gt;Blog:&lt;/strong&gt; &lt;a href="http://andrebaltieri.net"&gt;http://andrebaltieri.net&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside .NET Users Group Leader 
  &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=9079077" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author></entry><entry><title>MTAC - Microsoft Technical Audience Contributor</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/10/25/mtac-microsoft-technical-audience-contributor.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/10/25/mtac-microsoft-technical-audience-contributor.aspx</id><published>2011-10-25T16:21:18Z</published><updated>2011-10-25T16:21:18Z</updated><content type="html">&lt;p&gt;Durante o Community Zone passado (01 de Outubro). havia sido discutido e comentado sobre um novo título a nível nacional para os influenciadores (Não MSP/MVP) Microsoft.&lt;/p&gt;  &lt;p&gt;Hoje recebi o convite do Fabio Hara para me juntar ao programa como um MTAC, e fiquei feliz pela oportunidade/reconhecimento.&lt;/p&gt;  &lt;p&gt;Para quem quiser saber mais sobre o programa, aqui vai o link: &lt;a title="http://www.fabiohara.com.br/2011/10/25/mtac-microsoft-technical-audience-contributor-perguntas-e-respostas/" href="http://www.fabiohara.com.br/2011/10/25/mtac-microsoft-technical-audience-contributor-perguntas-e-respostas/"&gt;http://www.fabiohara.com.br/2011/10/25/mtac-microsoft-technical-audience-contributor-perguntas-e-respostas/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Abraços!&lt;/p&gt;  &lt;p&gt;&lt;b&gt;André Baltieri     &lt;br /&gt;MTAC - Microsoft Technical Audience Contributor      &lt;br /&gt;MSN:&lt;/b&gt; andrebaltieri@hotmail.com | &lt;b&gt;Twitter:&lt;/b&gt;    &lt;br /&gt;@andrebaltieri    &lt;br /&gt;&lt;b&gt;Blog:&lt;/b&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Inside .NET Users Group Leader   &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Learn MVC   &lt;br /&gt;&lt;a href="http://learn-mvc.net/"&gt;http://learn-mvc.net/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=8010320" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author></entry><entry><title>Community Zone 2011</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/09/25/community-zone-2011.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/09/25/community-zone-2011.aspx</id><published>2011-09-26T02:16:20Z</published><updated>2011-09-26T02:16:20Z</updated><content type="html">&lt;h3&gt;Introdução&lt;/h3&gt;  &lt;p&gt;O Community Zone é um evento fechado, realizado pela Microsoft especialmente para MVPs, MSPs e principais influenciadores.&lt;/p&gt;  &lt;p&gt;Este ano o evento será na sede da Microsoft Brasil, em São Paulo, um dia depois do TechEd, maior evento da Microsoft na américa latina.&lt;/p&gt;  &lt;p&gt;Ano passado já tive o prazer de participar deste evento (&lt;a href="https://andrebaltieri.wordpress.com/2010/09/18/tech-ed-2010-e-community-zone-2010/" target="_blank"&gt;Vide post antigo&lt;/a&gt;) e este ano novamente, a convite do Fabio Hara, estarei presente =D.&lt;/p&gt;  &lt;h3&gt;O que isto importa?&lt;/h3&gt;  &lt;p&gt;Durante este evento, temos contato direto com os gerentes de produto da Microsoft e ficamos por dentro das futuras novidades e tendências.&lt;/p&gt;  &lt;p&gt;Como sou líder da Inside .NET, com certeza irei repassar essa visão para comunidade, e espero ter boas novidades.&lt;/p&gt;  &lt;h3&gt;O que mais vem por ai?&lt;/h3&gt;  &lt;p&gt;Ahh, ainda é surpresa, mas estou preparando um evento focado em Mobile para região de Piracicaba, não um simples evento, um … bom… surpresa né.&lt;/p&gt;  &lt;p&gt;Abraços!&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;André Baltieri   &lt;br /&gt;@andrebaltieri&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7965681" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author></entry><entry><title>Profissionais Sênior</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/09/15/profissionais-s-234-nior.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/09/15/profissionais-s-234-nior.aspx</id><published>2011-09-16T03:22:57Z</published><updated>2011-09-16T03:22:57Z</updated><content type="html">&lt;h3&gt;Introdução&lt;/h3&gt;  &lt;p&gt;Senioridade é algo complexo. Quando se fala que é Sênior em alguma tecnologia ou assunto, a expectativa sempre é alta, esperando que o candidato nos surpreenda, que nos dê respostas mais exatas, ou até cite pontos que não conseguimos pensar antes.&lt;/p&gt;  &lt;p&gt;O fato é que hoje temos muitos falso sêniors! Curriculos recheados de tecnologias, palavras bonitas que as empresas sempre focam como ”trabalho em equipe”, “pró-atividade”, mas será que o candidato é mesmo sênior?&lt;/p&gt;  &lt;p&gt;Aqui descreverei alguns pontos que devemos refletir antes de colocar a palavra “Sênior” no currículo.&lt;/p&gt;  &lt;h3&gt;O que esperamos de um sênior&lt;/h3&gt;  &lt;p&gt;Primeiramente, não é por que você é programador que não deve pensar nos itens abaixo. Muita gente acha que só o gerente do projeto deve ser lider, responsável e etc. Este pensamento é errado, estes são responsabilidades de todos!&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Responsabilidade&lt;/strong&gt;      &lt;br /&gt;Um profissional sênior deve saber quando a responsabilidade é sua, e mesmo que não seja, se pode direcionar para alguém que possa ajudar (O famoso não sei fazer, mas sei quem sabe).      &lt;br /&gt;      &lt;br /&gt;Se for pensar em responsabilidade, imagina que o servidor da sua aplicação caiu. É responsabilidade sua ou do time de infraestrutura?      &lt;br /&gt;SUA! a aplicação é sua, você que toma conta, então você faz a ponte com o time de infra, para o usuário isto deve ser transparente!      &lt;br /&gt;      &lt;br /&gt;Este é só um dos varios exemplos que podemos citar. Delegar SUAS responsabilidades é algo “feio”.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Flexibilidade&lt;/strong&gt;      &lt;br /&gt;Um sênior não pode ser “mocinha”! Você deve sim se especializar em alguma tecnologia, mas se precisar fazer um serviço pra acessar uma tabela no SAP, ou um Job (Console Application) você também tem que estar preparado.      &lt;br /&gt;      &lt;br /&gt;Se precisar viajar, ficar até mais tarde (Este é um ponto delicado que em alguns casos até entendo a impossibilidade devido a problemas pessoais, familia e etc) você fica. Missão dada é missão cumprida!      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Ownership&lt;/strong&gt;      &lt;br /&gt;Você aceitou? Então faça! Fale com quem for preciso, não fique esperando as coisas acontecerem, vá atrás de resolver a situação, se você não sabe (Ninguém sabe tudo) peça ajuda a quem saiba, mas tenha esse comprometimento. Isso muda tudo!      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Pró-atividade&lt;/strong&gt;      &lt;br /&gt;Palavrinha chave que sempre vejo nos curriculos, e quando peço um exemplo, não conseguem me dar.      &lt;br /&gt;      &lt;br /&gt;Ser pró-ativo é tentar ao maximo resolver as coisas sem “engavetá-las”, sem deixar os problemas de lado, assumindo as responsabilidades. Em alguns casos você consegue até prever algumas situações e amenizá-las antes que elas aconteçam.      &lt;br /&gt;      &lt;br /&gt;Um profissional pró-ativo é aquele que sempre corre atrás para resolver situaçòes e conseguir trabalhar sussegado!      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Liderança&lt;/strong&gt;      &lt;br /&gt;Há um tempo atrás lí um livro interessante que chama-se “Você não precisa ser chefe para ser líder”. Mudou minha vida!      &lt;br /&gt;      &lt;br /&gt;Um bom líder é aquele que consegue criar todo o ambiente necessário para que sua equipe possa trabalhar sem impecílios e quase sem imprevistos.       &lt;br /&gt;      &lt;br /&gt;Um bom líder nunca precisa lembrar as pessoas que ele é o líder, todos veem isto!       &lt;br /&gt;      &lt;br /&gt;Um bom líder trata todos iguais mas de forma que cada um se sinta diferenciado e motivado na equipe.      &lt;br /&gt;      &lt;br /&gt;Um bom líder conduz todos ao ideal e aos objetivos definidos, removendo os obstáculos para que o time prossiga.      &lt;br /&gt;      &lt;br /&gt;Um bom líde SABE OUVIR, e assim (Somente assim) pode tomar a decisão certa.      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Espírito de Equipe&lt;/strong&gt;      &lt;br /&gt;Muitas cabeças junto geram idéias diferentes! Não leve para o pessoal quando alguém discorda das suas idéias, ou quando sua idéia não foi aceita. Um sênior faz este meio campo com facilidade.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Não me venha com chorumelas!&lt;/h3&gt;  &lt;p&gt;Deu tudo errado, e agora? De quem é a culpa?   &lt;br /&gt;Um sênior sabe assumir a sua parte da culpa e o mais importante, sabe corrigir os erros cometidos, ou apontá-los para que não se repitam no futuro.&lt;/p&gt;  &lt;p&gt;Um sênior não deve ficar culpando itens como “falha no servidor que impediu a publicação da aplicação a tempo”, pois um bom sênior teria previsto isto, quem trabalha com TI sabe que temos muitas coisas instáveis, e é melhor ter um tempo a mais no seu cronograma, entregar antes e surpreender o usuário, do que ter um cronograma justo e passar estes riscos.&lt;/p&gt;  &lt;h3&gt;Show me the code!&lt;/h3&gt;  &lt;p&gt;Do meu ponto de vista (Meu), nem adianta mostrar diploma da UNICAMP, USP e etc, nem milhões de certificações.&lt;/p&gt;  &lt;p&gt;Quando você diz que você é um programador C# sênior, ou um dev ASP.NET Sênior, o que espero ouvir de você são problemas grandes que você solucionou, experiências que passou, desafios.&lt;/p&gt;  &lt;p&gt;Você pode ter vários títulos no papel, mas se você nunca viveu os dramas de um projeto grande, com soluções complexas e vários casos que deram errado (Errando se aprende até mais), me desculpa, mas você não é sênior.&lt;/p&gt;  &lt;p&gt;Certificações te dão alguns pontos extra, mas não garantem sua senioridade!&lt;/p&gt;  &lt;h3&gt;Conclusão&lt;/h3&gt;  &lt;p&gt;&lt;em&gt;Baltieri você é chato, arrogante, metido e etc&lt;/em&gt;. Talvez, mas gosto das coisas certas! Se você vai participar de um processo seletivo, seja sincero! Quanto mais “senioridade” seu currículo tiver, mais que os entrevistadores vão te perturbar para tirar essas informações de você, e acredite, é muito fácil saber se um profissional de TI é sênior ou não!&lt;/p&gt;  &lt;p&gt;=)&lt;/p&gt;  &lt;p&gt;&lt;b&gt;André Baltieri     &lt;br /&gt;MSN:&lt;/b&gt; andrebaltieri@hotmail.com | &lt;b&gt;Twitter:&lt;/b&gt;    &lt;br /&gt;@andrebaltieri    &lt;br /&gt;&lt;b&gt;Blog:&lt;/b&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Inside .NET Users Group Leader   &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Learn MVC   &lt;br /&gt;&lt;a href="http://learn-mvc.net/"&gt;http://learn-mvc.net/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7954179" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="OFF-TOPIC" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/OFF-TOPIC/default.aspx" /></entry><entry><title>Repositório Genérico com EF 4.1</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/08/07/reposit-243-rio-gen-233-rico-com-ef-4-1.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/08/07/reposit-243-rio-gen-233-rico-com-ef-4-1.aspx</id><published>2011-08-07T23:49:19Z</published><updated>2011-08-07T23:49:19Z</updated><content type="html">&lt;ol&gt;   &lt;li&gt;Introdução &lt;/li&gt;    &lt;li&gt;Domain &lt;/li&gt;    &lt;li&gt;DataContexts &lt;/li&gt;    &lt;li&gt;Unit of Work &lt;/li&gt;    &lt;li&gt;Repositório Genérico &lt;/li&gt;    &lt;li&gt;Outros repositórios &lt;/li&gt;    &lt;li&gt;Camada de serviços &lt;/li&gt;    &lt;li&gt;Integrando com ASP.NET MVC &lt;/li&gt;    &lt;li&gt;Conclusão &lt;/li&gt;    &lt;li&gt;Source &lt;/li&gt;    &lt;li&gt;Referências &lt;/li&gt; &lt;/ol&gt;  &lt;h3&gt;1. Introdução&lt;/h3&gt;  &lt;p&gt;O Repository Pattern é um padrão conhecido e que consiste em persistir o estado das entidades no banco de dados (Repositório).&lt;/p&gt;  &lt;p&gt;Como há uma certa similaridade entre as ações das entidades (Por exemplo os métodos CRUD), a ideia é ter um repositório genérico, que sirva como base para todas as entidades da aplicação.&lt;/p&gt;  &lt;p&gt;Talvez alguns pontos possam ser melhorados, fiquem à vontade em sugerir melhorias =)&lt;/p&gt;  &lt;h3&gt;2. Domain&lt;/h3&gt;  &lt;p&gt;Não vou explicar a criação do domínio para não perder tempo, mas é somente a criação das três classes abaixo:&lt;/p&gt;    &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Domain.Entities&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; User&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        [Required(ErrorMessage=&lt;span class="str"&gt;&amp;quot;Campo obrigatório.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;Usuário&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; UserName { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Campo obrigatório.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        [DataType(DataType.EmailAddress)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;E-mail&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Email { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Campo obrigatório.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        [DataType(DataType.Password)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;Senha&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Password { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        [DataType(DataType.Password)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;Confirmar senha&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        [Compare(&lt;span class="str"&gt;&amp;quot;Password&amp;quot;&lt;/span&gt;, ErrorMessage = &lt;span class="str"&gt;&amp;quot;As senhas digitadas não conferem.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ConfirmPassword { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;h6&gt;Classe User.cs&lt;/h6&gt;



&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Domain.Entities&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Role&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Campo obrigatório.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;Perfil&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Campo obrigatório.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;Aplicação&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; ApplicationId { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; Application Application { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; ICollection&amp;lt;User&amp;gt; Users { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;h6&gt;Classe Role.cs&lt;/h6&gt;



&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.ComponentModel.DataAnnotations;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Domain.Entities&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Application&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        [Required(ErrorMessage = &lt;span class="str"&gt;&amp;quot;Campo obrigatório.&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        [Display(Name = &lt;span class="str"&gt;&amp;quot;Aplicação&amp;quot;&lt;/span&gt;)]&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;virtual&lt;/span&gt; ICollection&amp;lt;Role&amp;gt; Roles { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;h6&gt;Classe Application.cs&lt;/h6&gt;

&lt;h3&gt;3. DataContext&lt;/h3&gt;

&lt;p&gt;O contexto é o responsável por gerenciar os estados das entidades e seus grupos. Desta forma, o contexto fica da seguinte maneira (Por hora):&lt;/p&gt;



&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Entity;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Contexts&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SampleDataContext : DbContext&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;User&amp;gt; Users { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Role&amp;gt; Roles { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Application&amp;gt; Applications { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;h6&gt;Data/Contexts/SampleDataContext.cs&lt;/h6&gt;

&lt;h3&gt;4. Unit of Work&lt;/h3&gt;

&lt;p&gt;Se utilizarmos o contexto do jeito que ele está, quando precisarmos abrir duas ou mais requisições em um mesmo contexto, teremos problemas. Na aplicação web por exemplo, trabalharemos com o famoso “Session Per Request” onde abrimos uma sessão quando a página inicia e já fechamos a mesma quando a página termina de ser renderizada, mantendo a aplicação sempre desconectada do banco de dados.&lt;/p&gt;

&lt;p&gt;Para fazer este gerenciamento utilizaremos o Unit Of Work (Referência 1), que manterá a lista de objetos modificados, excluídos e incluídos (Tracker) na sessão. Com estes itens na sessão, nós decidiremos quando “comitar” estas modificações ou não.&lt;/p&gt;

&lt;p&gt;Sua implementação é simples, bastando criar uma interface como na &lt;strong&gt;Listagem 1&lt;/strong&gt; e implementa-lá no contexto, como na &lt;strong&gt;Listagem 2&lt;/strong&gt;.&lt;/p&gt;



&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Contexts.Interfaces&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IUnitOfWork&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Save();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;h6&gt;Listagem 1 – Unit of Work&lt;/h6&gt;



&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Entity;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts.Interfaces;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Contexts&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;{&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SampleDataContext : DbContext, IUnitOfWork&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;User&amp;gt; Users { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Role&amp;gt; Roles { get; set; }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Application&amp;gt; Applications { get; set; }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Save()&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.SaveChanges();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;

.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;h6&gt;Listagem 2 – Versão final do contexto&lt;/h6&gt;

&lt;h3&gt;5. Repositório Genérico&lt;/h3&gt;

&lt;p&gt;O repositório genérico conterá os métodos comuns entre todos os repositórios da aplicação, fique à vontade em incluir outros métodos que julgue comum em sua aplicação na interface e classe.&lt;/p&gt;

&lt;p&gt;Deste modo, criaremos a interface determinando quais métodos serão expostos e uma classe que implementará esta interface.&lt;/p&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Repositories.Interfaces&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IBaseRepository&amp;lt;T&amp;gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        T Find(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        IQueryable&amp;lt;T&amp;gt; List();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Add(T item);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Remove(T item);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Edit(T item);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;Data/Repositories/Interfaces/IBaseRepository.cs&lt;/h6&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts.Interfaces;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Repositories.Interfaces;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Repositories&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BaseRepository&amp;lt;T&amp;gt; &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        : IDisposable, IBaseRepository&amp;lt;T&amp;gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; SampleDataContext _context;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; Ctor&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; BaseRepository(IUnitOfWork unitOfWork)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (unitOfWork == &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentNullException(&lt;span class="str"&gt;&amp;quot;unitOfWork&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;            _context = unitOfWork &lt;span class="kwrd"&gt;as&lt;/span&gt; SampleDataContext;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; T Find(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _context.Set&amp;lt;T&amp;gt;().Find(id);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;T&amp;gt; List()&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _context.Set&amp;lt;T&amp;gt;();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add(T item)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            _context.Set&amp;lt;T&amp;gt;().Add(item);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Remove(T item)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;            _context.Set&amp;lt;T&amp;gt;().Remove(item);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Edit(T item)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;            _context.Entry(item).State = EntityState.Modified;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;            _context.Dispose();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;Data/Repositories/BaseRepository.cs&lt;/h6&gt;

&lt;p&gt;A única observação é que o repositório recebe em seu construtor o “Unit of Work” que se refere a sessão atual onde as entidades serão gerenciadas.&lt;/p&gt;

&lt;h3&gt;6. Outros repositórios&lt;/h3&gt;

&lt;p&gt;Com o repositório genérico criado, vamos criar os outros repositórios, e para cada repositório sua interface, para que possam ser injetadas futuramente.&lt;/p&gt;

&lt;p&gt;Aqui listarei somente o repositório da classe Role, para ver o resto consulte o código disponibilizado na sessão 10 deste artigo.&lt;/p&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Repositories.Interfaces&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IRoleRepository : IBaseRepository&amp;lt;Role&amp;gt;, IDisposable&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;Data/Repositories/Interfaces/IRoleRepository.cs&lt;/h6&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;br /&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts.Interfaces;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Repositories.Interfaces;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Data.Repositories&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RoleRepository: BaseRepository&amp;lt;Role&amp;gt;, IRoleRepository&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        IUnitOfWork unitOfWork = &lt;span class="kwrd"&gt;new&lt;/span&gt; SampleDataContext();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; RoleRepository(IUnitOfWork unitOfWork) &lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;            : &lt;span class="kwrd"&gt;base&lt;/span&gt;(unitOfWork)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;            &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;Data/Repositories/RoleRepository.cs&lt;/h6&gt;

&lt;p&gt;Como existem várias formas de gerenciar contexto com Unit of Work, aqui eu instancio ele na classe internamente, mas ele poderia ser recebido pelo construtor e passado adiante.&lt;/p&gt;

&lt;h3&gt;7. Camada de serviços&lt;/h3&gt;

&lt;p&gt;Com os repositórios criados, é hora de ver como utiliza-los, e para este caso utilizarei a camada de serviços.&lt;/p&gt;

&lt;p&gt;A camada de serviços acumula toda burocracia que ficaria nos controllers, e como a ideia é ter os controllers limpos, podemos trazer o código para cá para ajudar.&lt;/p&gt;

&lt;p&gt;Assim como os repositórios tem suas operações em comum, os serviços também tem.`&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Para utilizar o ModelStateDictionary é preciso adicionar referência ao namespace System.Web.Mvc.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Service.Interfaces&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IBaseService&amp;lt;T&amp;gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        T Find(&lt;span class="kwrd"&gt;int&lt;/span&gt; id);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        IQueryable&amp;lt;T&amp;gt; List();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Add(T item);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Remove(T item);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;        &lt;span class="kwrd"&gt;void&lt;/span&gt; Edit(T item);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;IBaseService.cs&lt;/h6&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Contexts.Interfaces;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Repositories;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Data.Repositories.Interfaces;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Service.Interfaces;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Service&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; BaseService&amp;lt;T&amp;gt; : IBaseService&amp;lt;T&amp;gt; &lt;span class="kwrd"&gt;where&lt;/span&gt; T : &lt;span class="kwrd"&gt;class&lt;/span&gt;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        IUnitOfWork unitOfWork = &lt;span class="kwrd"&gt;new&lt;/span&gt; SampleDataContext();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        IBaseRepository&amp;lt;T&amp;gt; _repository;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; BaseService()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            _repository = &lt;span class="kwrd"&gt;new&lt;/span&gt; BaseRepository&amp;lt;T&amp;gt;(unitOfWork);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; T Find(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _repository.Find(id);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; IQueryable&amp;lt;T&amp;gt; List()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _repository.List();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Add(T item)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;        {           &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;            _repository.Add(item);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;            unitOfWork.Save();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Remove(T item)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;            _repository.Remove(item);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            unitOfWork.Save();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Edit(T item)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;            _repository.Edit(item);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            unitOfWork.Save();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;    &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose()&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;            _repository.Dispose();&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;BaseService.cs&lt;/h6&gt;

&lt;p&gt;Com o serviço base criado, basta criar os outros serviços herdando deste serviço base e implementar os métodos adicionais necessários.&lt;/p&gt;

&lt;p&gt;Nos exemplos abaixo, criei um método Validate(T item) para exemplificar a criação de métodos adicionais. Na maioria das vezes este método verifica se o item já está cadastrado.&lt;/p&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Service.Interfaces&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;interface&lt;/span&gt; IRoleService : IBaseService&amp;lt;Role&amp;gt;, IDisposable&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        &lt;span class="kwrd"&gt;bool&lt;/span&gt; Validate(Role role);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;IRoleService.cs&lt;/h6&gt;

&lt;p&gt;
  &lt;br /&gt;

  &lt;br /&gt;

  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Service.Interfaces;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Service&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RoleService : BaseService&amp;lt;Role&amp;gt;, IRoleService&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;        &lt;span class="kwrd"&gt;private&lt;/span&gt; ModelStateDictionary _modelState;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; RoleService(ModelStateDictionary modelState)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;            _modelState = modelState;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; Validate(Role item)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (item.Id == 0)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;                &lt;span class="kwrd"&gt;if&lt;/span&gt; (&lt;span class="kwrd"&gt;this&lt;/span&gt;.List().Where(c =&amp;gt; c.Name == item.Name).Count() &amp;gt; 0)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;                    _modelState.AddModelError(&lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Perfil já cadastrado&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; _modelState.IsValid;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;RoleService.cs&lt;/h6&gt;

&lt;p&gt;Os demais serviços podem ser vistos no código fonte, que pode ser baixado no fim do artigos.&lt;/p&gt;

&lt;h3&gt;8. Integrando com ASP.NET MVC&lt;/h3&gt;

&lt;p&gt;A integração com o ASP.NET MVC é tranquila, abaixo está o código do controller RoleController.cs. Escolhi este controller pois o Role pertence à uma Application, e sendo assim, será necessário ter um DropDownList para escolher a aplicação, na criação do perfil.&lt;/p&gt;

&lt;p&gt;Os outros controllers estão no source.&lt;/p&gt;

&lt;p&gt;
  &lt;div class="csharpcode"&gt;
    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data.Entity;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Mvc;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Domain.Entities;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Service;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; SampleApp.Service.Interfaces;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; SampleApp.Web.Controllers&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;{&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RoleController : Controller&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;        IRoleService _service;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        IApplicationService _applicationService;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; RoleController()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;            _service = &lt;span class="kwrd"&gt;new&lt;/span&gt; RoleService(&lt;span class="kwrd"&gt;this&lt;/span&gt;.ModelState);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;            _applicationService = &lt;span class="kwrd"&gt;new&lt;/span&gt; ApplicationService(&lt;span class="kwrd"&gt;this&lt;/span&gt;.ModelState);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="preproc"&gt;#region&lt;/span&gt; Actions&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Index()&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;                _service.List().Include(r =&amp;gt; r.Application));&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ViewResult Details(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(_service.List()&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  31:  &lt;/span&gt;                .Include(r =&amp;gt; r.Application)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  32:  &lt;/span&gt;                .Where(r =&amp;gt; r.Id == id).First());&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  33:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  34:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  35:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Create()&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  36:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  37:  &lt;/span&gt;            ViewBag.ApplicationId = &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  38:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; SelectList(_applicationService.List(), &lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  39:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  40:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  41:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  42:  &lt;/span&gt;        [HttpPost]&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  43:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Create(Role role)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  44:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  45:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_service.Validate(role))&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  46:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  47:  &lt;/span&gt;                _service.Add(role);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  48:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(&lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  49:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  50:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  51:  &lt;/span&gt;            ViewBag.ApplicationId = &lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  52:  &lt;/span&gt;                &lt;span class="kwrd"&gt;new&lt;/span&gt; SelectList(_applicationService.List(), &lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  53:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(role);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  54:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  55:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  56:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(&lt;span class="kwrd"&gt;int&lt;/span&gt; id)&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  57:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  58:  &lt;/span&gt;            var role = _service.Find(id);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  59:  &lt;/span&gt;            ViewBag.ApplicationId = &lt;span class="kwrd"&gt;new&lt;/span&gt; SelectList(&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  60:  &lt;/span&gt;                _applicationService.List(), &lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, role.ApplicationId);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  61:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(_service.Find(id));&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  62:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  63:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  64:  &lt;/span&gt;        [HttpPost]&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  65:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult Edit(Role role)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  66:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  67:  &lt;/span&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (_service.Validate(role))&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  68:  &lt;/span&gt;            {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  69:  &lt;/span&gt;                _service.Edit(role);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  70:  &lt;/span&gt;                &lt;span class="kwrd"&gt;return&lt;/span&gt; RedirectToAction(&lt;span class="str"&gt;&amp;quot;Index&amp;quot;&lt;/span&gt;);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  71:  &lt;/span&gt;            }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  72:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  73:  &lt;/span&gt;            ViewBag.ApplicationId = &lt;span class="kwrd"&gt;new&lt;/span&gt; SelectList(&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  74:  &lt;/span&gt;                _applicationService.List(), &lt;span class="str"&gt;&amp;quot;Id&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;Name&amp;quot;&lt;/span&gt;, role.ApplicationId);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  75:  &lt;/span&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; View(role);&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  76:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  77:  &lt;/span&gt;        &lt;span class="preproc"&gt;#endregion&lt;/span&gt;&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  78:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  79:  &lt;/span&gt;        &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Dispose(&lt;span class="kwrd"&gt;bool&lt;/span&gt; disposing)&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  80:  &lt;/span&gt;        {&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  81:  &lt;/span&gt;            _service.Dispose();&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  82:  &lt;/span&gt;            &lt;span class="kwrd"&gt;base&lt;/span&gt;.Dispose(disposing);&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  83:  &lt;/span&gt;        }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  84:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

    &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  85:  &lt;/span&gt;    }&lt;/pre&gt;

    &lt;pre&gt;&lt;span class="lnum"&gt;  86:  &lt;/span&gt;}&lt;/pre&gt;
  &lt;/div&gt;
  &lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;&lt;/p&gt;

&lt;h6&gt;RoleController.cs&lt;/h6&gt;

&lt;h3&gt;9. Conclusão&lt;/h3&gt;

&lt;p&gt;OK, eu concordo que escrevi um bocado de código, mas que isto irá salvar muitas linhas de código posteriormente.&lt;/p&gt;

&lt;p&gt;Generalizando os repositórios e os serviços, economizamos boa parte do tempo de desenvolvimento e teste, já que a maioria das entidades possuem métodos CRUD e para muitas os métodos CRUD são tudo que elas possuem.&lt;/p&gt;

&lt;h3&gt;10.&amp;#160; Source&lt;/h3&gt;

&lt;p&gt;&lt;a href="http://files.insidedotnet.com.br/EF4.1.Generic.Repository.zip" target="_blank"&gt;EF 4.1 Generic Repository&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;11. Referências&lt;/h3&gt;

&lt;ol&gt;
  &lt;li&gt;Using Repository and Unit of Work patterns with Entity Framework 4.0 
    &lt;br /&gt;&lt;a href="http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx"&gt;http://blogs.msdn.com/b/adonet/archive/2009/06/16/using-repository-and-unit-of-work-patterns-with-entity-framework-4-0.aspx&lt;/a&gt; 

    &lt;br /&gt;&lt;/li&gt;

  &lt;li&gt;ASP.NET MVC–Validação de dados [Camada de Serviço]
    &lt;br /&gt;&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/01/08/asp-net-mvc-valida-231-227-o-de-dados-camada-de-servi-231-o.aspx"&gt;http://weblogs.asp.net/andrebaltieri/archive/2011/01/08/asp-net-mvc-valida-231-227-o-de-dados-camada-de-servi-231-o.aspx&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7900864" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 3" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+3/default.aspx" /><category term="EF 4.1" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/EF+4.1/default.aspx" /></entry><entry><title>Primeiras informações sobre o ASP.NET MVC 4</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/07/14/primeiras-informa-231-245-es-sobre-o-asp-net-mvc-4.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/07/14/primeiras-informa-231-245-es-sobre-o-asp-net-mvc-4.aspx</id><published>2011-07-15T00:30:35Z</published><updated>2011-07-15T00:30:35Z</updated><content type="html">&lt;h3&gt;Introdução&lt;/h3&gt;  &lt;p&gt;Ontem foi anunciado um roadmap com as possíveis novas funcionalidades do ASP.NET MVC 4. O que acontece é que novamente o time do ASP.NET MVC quer o nosso feedback para melhorar ainda mais a ferramenta, e eu acho isto fantástico.&lt;/p&gt;  &lt;p&gt;O roadmap completo pode ser encontrado neste endereço: &lt;a title="http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap" href="http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap"&gt;http://aspnet.codeplex.com/wikipage?title=ASP.NET%20MVC%204%20RoadMap&lt;/a&gt; e como o próprio Phil Hack diz, nada é confirmado ainda!&lt;/p&gt;  &lt;h3&gt;Themes&lt;/h3&gt;  &lt;p&gt;Os times de ASP.NET e ASP.NET MVC conversaram e o time de ASP.NET tinha um conjunto de temas, que por sua vez não eram específicos para o ASP.NET MVC, que ocorreu na dificuldade da implementação dos temas no ASP.NET MVC. Eles estão agora trabalhando com parceiros fora da Microsoft para alcançar este objetivo.&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Desenvolvimento e Deploy:&lt;/strong&gt; A idéia é que o desenvolvimento e implantação destes temas sejam simples e fáceis.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Melhorias nas View Engines:&lt;/strong&gt; A engine Razor e alguns Helpers do ASP.NET MVC sairam de páginas ASP.NET Web Forms. Eles pretendem continuar investindo em recursos que podem ser compartilhados entre ambas plataformas.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Ajax:&lt;/strong&gt; Eles tem idéias para melhorar a utilização do Ajax no ASP.NET MVC. Eles já tem várias ideias em fase de desenvolvimeno para melhorar o uso do Ajax, principalmente em pontos críticos.&lt;/li&gt;    &lt;li&gt;&lt;strong&gt;HTML 5, tablet e Mobile:&lt;/strong&gt; Com o aumento da produção de aplicações web, o ASP.NET MVC não pode ficar de fora, e a idéia é que o ASP.NET MVC torne isto fácil.&lt;/li&gt;    &lt;li&gt;Cloud ready: Possibilidade de templates prontos para o Windows Azure.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Recipes (Extensible Task-Based Tooling)&lt;/h3&gt;  &lt;p&gt;&lt;strong&gt;Recipes&lt;/strong&gt; é uma novidade interessante do ASP.NET MVC 4 (Inclusive o Phil comentou isto no Blog). Algumas tarefas requerem modificações em várias sessões de uma aplicação, como por exemplo adicionar Ajax a uma Grid. Primeiro você tem que gerar as views e depois adicionar o Ajax. É exatamente aqui que os Recipes vão atuar.&lt;/p&gt;  &lt;p&gt;O Recipe é uma caixa de diálogo (?) entregue via NuGet associada com uma UI e código para automatizar uma task específica.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Exemplos:&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Ajax Grid&lt;/li&gt;    &lt;li&gt;Implementação de autenticação baseada no OAuth&lt;/li&gt;    &lt;li&gt;Suporte a autenticações baseadas em Claims, fornecidas pelo WIF.&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Criando, Publicando e Instalando um Recipe:&lt;/h3&gt;  &lt;p&gt;Para criar um Recipe tudo que necessitaremos será uma dialog box utilizando uma API do Recipe. &lt;/p&gt;  &lt;p&gt;Por exemplo, para aficionar um controller para uma area em um projeto ASP.NET MVC usanto um DTE, pode tomar muito tempo e exigir várias chamadas a métodos, mas com a API do recipe será concentrado e simples de usar.&lt;/p&gt;  &lt;p&gt;A idéia é novamente trabalhar com componentização e distribuir estes pacotes sempre via NuGet.&lt;/p&gt;  &lt;h3&gt;Recipe Mockups&lt;/h3&gt;  &lt;p&gt;Abaixo um exemplo da janela de seleção dos Recipes. &lt;/p&gt;  &lt;p&gt;&lt;img title="recipe-menu" border="0" alt="recipe-menu" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;amp;DownloadId=258899" width="233" height="312" /&gt;&lt;/p&gt;  &lt;p&gt;&lt;img title="wif-recipe" border="0" alt="wif-recipe" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;amp;DownloadId=258900" width="559" height="229" /&gt;&lt;/p&gt;  &lt;h3&gt;Built In Recipes&lt;/h3&gt;  &lt;p&gt;Built-in recipes serão Recipes que já virão inclusos no ASP.NET MVC 4 e entre eles estão os candidatos OAuth support, Ajax grid e WIF.&lt;/p&gt;  &lt;h3&gt;Mudanças nos templates Mobile&lt;/h3&gt;  &lt;p&gt;Como comentei acima, parece que teremos suporte a aplicações Mobile no ASP.NET MVC 4. Abaixo as duas telas mostram as diferenças entre aplicações Web e Mobile rodando no browser de um dispositivo móvel.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;amp;DownloadId=258901" width="624" height="352" /&gt;&lt;/p&gt;  &lt;p&gt;Pelo que me parece eles utilizaram o jQuery Mobile (Biblioteca jQuery para dispositivos móveis) e incluirão um template exclusivo para este tipo de aplicação, parecido com o abaixo.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;amp;DownloadId=258902" width="389" height="396" /&gt;&lt;/p&gt;  &lt;h3&gt;Device-Specific Views&lt;/h3&gt;  &lt;p&gt;As views agora podem ser específicas para um determinado dispositvo. Isto é legal pois imaginem um cenário onde minha aplicação web atende também meus clientes via SmartPhone, não precisaremos mais replicar a aplicação, recriando os controllers e etc, podemos definir isto nas views apenas, como mostrado abaixo:&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;amp;DownloadId=258903" width="432" height="326" /&gt;&lt;/p&gt;  &lt;p&gt;Para isto, um novo dialog para criação de Views/Controller deve ser entregue, tendo opção de criar Views para dispositivos móveis com jQuery Mobile.&lt;/p&gt;  &lt;p&gt;&lt;img title="image" border="0" alt="image" src="http://download.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=aspnet&amp;amp;DownloadId=258904" width="531" height="482" /&gt;&lt;/p&gt;  &lt;h3&gt;Device Switcher&lt;/h3&gt;  &lt;p&gt;O device switcher permite que o usuário seja direcionado para uma aplicação Web ou Mobile de acordo com seu browser. De nada adiantaria todos aqueles templates com jQuery se este switcher não existisse.&lt;/p&gt;  &lt;p&gt;Neste caso não precisaremos nos preocupar, se o usuário acessar a aplicação de um dispositivo móvel, será automaticamente direcionado a area móvel do site.&lt;/p&gt;  &lt;h3&gt;Razor Helpers Support&lt;/h3&gt;  &lt;p&gt;Hoje conseguimos escrever códigos com Razor e armazenál-los em arquivos .cshtml ou .vbhtml. A idéia é que possamos criar class libraries desses códigos para reutilizá-los nas páginas.&lt;/p&gt;            &lt;h3&gt;Task e Task&amp;lt;T&amp;gt;&lt;/h3&gt;  &lt;p&gt;Chamadas assíncronas estão presentes em quase todas aplicações, já deixaram de ser novidade e passaram a ser obrigatoriedade.&lt;/p&gt;  &lt;p&gt;As melhorias no ASP.NET MVC 4 em relação a chamadas assíncronas deve-se a implementação da funcionalidade Task (Task e Task&amp;lt;T&amp;gt;), que trazem uma boa redução de código na escrita de chamadas assíncronas.&lt;/p&gt;  &lt;p&gt;O código abaixo é escrito em uma aplicação ASP.NET MVC 3:&lt;/p&gt;  &lt;div class="csharpcode"&gt;   &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; IndexAsync(&lt;span class="kwrd"&gt;string&lt;/span&gt; city) {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    AsyncManager.OutstandingOperations.Increment(2);&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    NewsService newsService = &lt;span class="kwrd"&gt;new&lt;/span&gt; NewsService();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    newsService.GetHeadlinesCompleted += (sender, e) =&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        AsyncManager.Parameters[&lt;span class="str"&gt;&amp;quot;headlines&amp;quot;&lt;/span&gt;] = e.Value;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        AsyncManager.OutstandingOperations.Decrement();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;    newsService.GetHeadlinesAsync();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    SportsService sportsService = &lt;span class="kwrd"&gt;new&lt;/span&gt; SportsService();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    sportsService.GetScoresCompleted += (sender, e) =&amp;gt;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;    {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        AsyncManager.Parameters[&lt;span class="str"&gt;&amp;quot;scores&amp;quot;&lt;/span&gt;] = e.Value;&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        AsyncManager.OutstandingOperations.Decrement();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;    };&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;    sportsService.GetScoresAsync();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;}&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;&amp;#160;&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult IndexCompleted(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] headlines, &lt;span class="kwrd"&gt;string&lt;/span&gt;[] scores, &lt;span class="kwrd"&gt;string&lt;/span&gt;[] forecast) {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(&lt;span class="str"&gt;&amp;quot;Common&amp;quot;&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt; PortalViewModel  {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;        NewsHeadlines = headlines,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;        SportsScores = scores,&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;E o abaixo em um ASP.NET MVC 4:&lt;/p&gt;

&lt;div class="csharpcode"&gt;
  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; async Task&amp;lt;ActionResult&amp;gt; Index(&lt;span class="kwrd"&gt;string&lt;/span&gt; city) {&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;    var newsService = &lt;span class="kwrd"&gt;new&lt;/span&gt; NewsService();&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;    var sportsService = &lt;span class="kwrd"&gt;new&lt;/span&gt; SportsService();&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;    &lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;return&lt;/span&gt; View(&lt;span class="str"&gt;&amp;quot;Common&amp;quot;&lt;/span&gt;,&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;        &lt;span class="kwrd"&gt;new&lt;/span&gt; PortalViewModel {&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;        NewsHeadlines = await newsService.GetHeadlinesAsync(),&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;        SportsScores = await sportsService.GetScoresAsync()&lt;/pre&gt;

  &lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    });&lt;/pre&gt;

  &lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;style type="text/css"&gt;
.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: consolas, "Courier New", courier, monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}
.csharpcode pre { margin: 0em; }
.csharpcode .rem { color: #008000; }
.csharpcode .kwrd { color: #0000ff; }
.csharpcode .str { color: #006080; }
.csharpcode .op { color: #0000c0; }
.csharpcode .preproc { color: #cc6633; }
.csharpcode .asp { background-color: #ffff00; }
.csharpcode .html { color: #800000; }
.csharpcode .attr { color: #ff0000; }
.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 100%;
	margin: 0em;
}
.csharpcode .lnum { color: #606060; }&lt;/style&gt;



&lt;p&gt;Muito mais simples =)&lt;/p&gt;

&lt;p&gt;Para isto, foi necessária a utilização do &lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=9983"&gt;Visual Studio Async CTP&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;CSS and JavaScript Bundling Integration&lt;/h3&gt;

&lt;p&gt;Esta funcionalidade combinará arquivos .css e .js em um só, reduzindo o tamanho dos mesmos, cortando espaços em branco e comentátios (minification).&lt;/p&gt;

&lt;h3&gt;Outras funcionalidades&lt;/h3&gt;

&lt;ul&gt;
  &lt;li&gt;EF Code First Data Migration – Permite mudança de versão do seu banco de dados sem perder todos os dados. (Esta é uma funcionalidade que espero com carinho)&lt;/li&gt;

  &lt;li&gt;Melhor suporte para testes funcionáis e de integração.&lt;/li&gt;

  &lt;li&gt;API baseada em WCF.&lt;/li&gt;

  &lt;li&gt;Melhorias no trabalho com Ajax =D&lt;/li&gt;

  &lt;li&gt;Suporte ao HTML 5.&lt;/li&gt;

  &lt;li&gt;Melhorias na segurança durante utilização de áreas.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Conclusão&lt;/h3&gt;

&lt;p&gt;O time do ASP.NET MVC sempre me surpreende e mais uma vez traz novidades incríveis. Mesmo sabendo que nada é oficial ainda, já fico empolgado e pensando onde implementar (Ou o que melhorar) com estas novas funcionalidades.&lt;/p&gt;

&lt;p&gt;Podemos aguardar muito mais coisas desta plataforma que fica mais madura a cada dia que passa.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;André Baltieri 
    &lt;br /&gt;MSN:&lt;/b&gt; andrebaltieri@hotmail.com | &lt;b&gt;Twitter:&lt;/b&gt; @andrebaltieri 

  &lt;br /&gt;&lt;b&gt;Blog:&lt;/b&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Inside .NET Users Group Leader 
  &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7870304" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 4" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+4/default.aspx" /></entry><entry><title>ASP.NET MVC – Utilizando areas para organizar a aplicação</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/15/asp-net-mvc-utilizando-areas-para-organizar-a-aplica-231-227-o.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/06/15/asp-net-mvc-utilizando-areas-para-organizar-a-aplica-231-227-o.aspx</id><published>2011-06-15T22:32:00Z</published><updated>2011-06-15T22:32:00Z</updated><content type="html">&lt;h3&gt;Introdução&lt;/h3&gt;  &lt;p&gt;No post anterior (&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx" mce_href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx" target="_blank"&gt;ASP.NET MVC 3 – Desenvolver ficou fácil&lt;/a&gt;) eu comentei sobre o uso de áreas para melhor organizar a aplicação Web (Não a solução), porém não apliquei na prática o conceito.&lt;/p&gt;  &lt;p&gt;Um cenário comum para as áreas é um e-Commerce por exemplo, onde temos uma área para os usuários, que podem ver ou comprar os produtos e outra área administrativa, para que os funcionários cadastrem os produtos.&lt;/p&gt;  &lt;p&gt;Não temos um limite de áreas a serem criadas, e cada área pode possuir seus próprios controllers, views, css, scripts e etc. É como se fosse uma nova aplicação, porém, reaproveitando o domínio e outras coisas compartilhadas entre os projetos.&lt;/p&gt;  &lt;h3&gt;Criando áreas&lt;/h3&gt;  &lt;p&gt;Como era de se esperar, o Visual Studio novamente dá uma “mãozinha” e permite a criação de uma nova área com poucos cliques (E claro, todo código gerado pode ser editado).&lt;/p&gt;  &lt;p&gt;Para não tomar muito tempo, utilizarei o projeto anterior, que pode ser encontrado neste link:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://downloads.insidedotnet.com.br/20110614_MvcFakeStore.zip" mce_href="http://downloads.insidedotnet.com.br/20110614_MvcFakeStore.zip" target="_blank"&gt;Código Fonte&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Com a solução carregada, clique com o botão direito do mouse sobre o projeto MvcFakeStore.Web e selecione a opção Add –&amp;gt; Area, como mostrado na &lt;b&gt;Figura 1&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_4DD5A014.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_4DD5A014.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4576EC1F.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4576EC1F.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 1 – Adicionando uma nova área.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Uma nova janela se abrirá, para que esta área seja nomeada. No meu exemplo utilizei o nome “Administrativo”.&lt;/p&gt;  &lt;p&gt;Neste ponto, uma nova estrutura de pastas foi criada na aplicação, como mostrado na &lt;b&gt;Figura 2&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_24F23D1E.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_24F23D1E.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4607CA69.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4607CA69.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 2 – Estrutura de pastas criado para a nova área.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;É importante notar que temos a mesma estrutura da pasta raiz da aplicação dentro desta área, incluindo as pastas model, Views, Shared e etc, ou seja, é como se fosse outra aplicação.&lt;/p&gt;  &lt;p&gt;Em extra será criado um arquivo com o nome &amp;lt;SuaArea&amp;gt;AreaRegistration.cs que se encarregará de registrar a área na aplicação e fazer o mapeamento das URLs também para sua área.&lt;/p&gt;  &lt;p&gt;Com a área criada, criarei os dois controllers (ProductController e CategoryController) novamente nesta área, e posteriormente, deixarei somente os metodos Index e Details (Listar e ver detalhes dos produtos/categoria) nos controllers da raiz da aplicação, e os métodos de criação, edição e exclusão, dentro da área administrativa.&lt;/p&gt;  &lt;p&gt;Antes de começar, copie o arquivo _Layout.cshtml da pastas /Views/Shared para a pasta Areas/Administrativo/Views/Shared, como mostrado na &lt;b&gt;Figura 3&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_17B0D56D.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_17B0D56D.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_54D721A3.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_54D721A3.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 3 – Copia do arquivo _Layout.cshtml&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Aproveite para abrir o arquivo e alterar seu cabeçalho, como mostrado na &lt;b&gt;Figura 4&lt;/b&gt;, apenas para diferenciar as áreas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_61D39265.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_61D39265.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_7FD6C1BB.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_7FD6C1BB.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 4 – Alterando o cabeçalho da página inicial.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Feito isso, na nova área criada, repita os passos do artigo “&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx" mce_href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx" target="_blank"&gt;ASP.NET MVC 3 – Desenvolver ficou fácil&lt;/a&gt;”, sessão “Criando os Controllers e Views com Scaffolding Templates”, porém utilizando a pasta Controllers da área “Administrativo” que acabamos de criar e também alterando o template padrão, para usar este Layout que acabamos de criar, como na &lt;b&gt;Figura 5&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_04E0B17E.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_04E0B17E.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_513AD5D0.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_513AD5D0.png" border="0" height="145" width="244"&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_37D56347.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_37D56347.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_321CDA52.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_321CDA52.png" border="0" height="145" width="244"&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_03C5E556.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_03C5E556.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_53C345E7.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_53C345E7.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 5 – Selecionando o template das Views.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ao fim a estrutura do projeto deve estar similar a apresentada na &lt;b&gt;Figura 6&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_5E832DED.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_5E832DED.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4DA11AAE.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4DA11AAE.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 6 – Estrutura do projeto ao fim da criação dos controllers e views.&lt;/b&gt;&lt;/p&gt;  &lt;h3&gt;Decorando as Classes&lt;/h3&gt;  &lt;p&gt;Assim como fizemos no artigo anterior “&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx" mce_href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx"&gt;ASP.NET MVC 3 – Desenvolver ficou fácil&lt;/a&gt;”, redecoraremos as classes, agora de acordo com suas áreas, como mostrado nas imagens abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_3F65326F.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_3F65326F.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_151B1BF6.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_151B1BF6.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;ProductController.cs&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_66C426F9.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_66C426F9.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_7CB029FA.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_7CB029FA.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;CategoryController.cs&lt;/p&gt;  &lt;p&gt;Voltando ao projeto inicial, removeremos os métodos de criação, exclusão e edição dos controllers, e suas respectivas Views, como mostrado nas imagens abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_206BE246.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_206BE246.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_41816F91.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_41816F91.png" border="0" height="145" width="244"&gt;&lt;/a&gt;&amp;nbsp; &lt;br&gt;CategoryController.cs (Raiz do site)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_0800F04B.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_0800F04B.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_49318A53.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_49318A53.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;ProductController.cs (Raiz do site)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_61C3B854.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_61C3B854.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_54EBF2E7.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_54EBF2E7.png" border="0" height="145" width="244"&gt;&lt;/a&gt;&amp;nbsp; &lt;br&gt;Views removidas, restando apenas as necessárias.&lt;/p&gt;  &lt;h3&gt;ActionLinks para áreas diferentes&lt;/h3&gt;  &lt;p&gt;Até este ponto temos a aplicação dividida entre site e setor administrativo, para demonstrar a criação de ActionLinks entre areas, criaremos um link no _Layout.cshtml do site ligando-o com a área administrativa, como mostrado na &lt;b&gt;Figura 7&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_228AB019.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_228AB019.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_61151F21.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_61151F21.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 7 – ActionLink parametrizado para direcionar para um controller/action de uma área específica.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Note que simplesmente definimos um parâmetro “area” e informamo a qual área o usuário será redirecionado. Por fim como a sobrecarga do método exige um parâmetro para os Html Objects, informamos null para dar um by pass.&lt;/p&gt;  &lt;h3&gt;Controllers iguais em áreas diferentes&lt;/h3&gt;  &lt;p&gt;Em alguns casos, pode acontecer um conflito entre controllers (Caso do controller Home – Se criar outro controller Home na área Administrativa ocorrerá o erro da &lt;b&gt;Figura 8&lt;/b&gt;.)&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_74C49966.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_74C49966.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_00EB34F0.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_00EB34F0.png" border="0" height="169" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 8 – Erro de controllers duplicados.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Para corrigir este problemas precisamos informar qual namespace do controller home principal nas definições das rotas, no arquivo Global.asax.&lt;/p&gt;  &lt;p&gt;A &lt;b&gt;Figura 9&lt;/b&gt; mostra a solução para este problema.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_392C3CB9.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_392C3CB9.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_79F0A3CC.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_79F0A3CC.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 9 – Adicionando namespaces para definir o controller a ser mapeado.&lt;/b&gt;&lt;/p&gt;  &lt;h3&gt;Conclusão&lt;/h3&gt;As áreas nos permitem uma divisão dentro das aplicações MVC, é como se tivessemos dois sites dentro de apenas um. Além disso contamos com o compartilhamento das informações entre os sites, o domínio e até o layout.  &lt;h3&gt;Downloads&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://downloads.insidedotnet.com.br/20110615_MvcFakeStore_Areas.zip" mce_href="http://downloads.insidedotnet.com.br/20110615_MvcFakeStore_Areas.zip" target="_blank"&gt;Código Fonte&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Espero que o artigo seja útil.&lt;/p&gt;  &lt;p&gt;Até o próximo artigo!&lt;/p&gt;  &lt;p&gt;   &lt;br&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;André Baltieri     &lt;br&gt;MSN:&lt;/b&gt; andrebaltieri@hotmail.com | &lt;b&gt;Twitter:&lt;/b&gt; @andrebaltieri    &lt;br&gt;&lt;b&gt;Blog:&lt;/b&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri" mce_href="http://weblogs.asp.net/andrebaltieri"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Inside .NET Users Group Leader   &lt;br&gt;&lt;a href="http://www.insidedotnet.com.br/" mce_href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7830918" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 3" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+3/default.aspx" /><category term="ASP.NET MVC" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC/default.aspx" /></entry><entry><title>ASP.NET MVC 3 – Desenvolver ficou fácil</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/06/14/asp-net-mvc-3-desenvolver-ficou-f-225-cil.aspx</id><published>2011-06-14T21:58:00Z</published><updated>2011-06-14T21:58:00Z</updated><content type="html">&lt;p&gt;Primeiramente, gostaria dizer que após um tempo ausente da comunidade devido a trabalho e projetos pessoais, estou de volta.&lt;/p&gt;  &lt;h3&gt;Introdução&lt;/h3&gt;  &lt;p&gt;O intúito deste post é criar uma aplicação completa com o ASP.NET MVC 3, tendo como base várias dúvidas que recebo sobre a tecnologia e também mostrar que desenvolver utilizando o ASP.NET MVC também é fácil.&lt;/p&gt;  &lt;p&gt;Desta forma, este post exemplificará os principais pontos no desenvolvimento de uma aplicação com ASP.NET MVC 3 (Incluindo o &lt;a href="http://www.microsoft.com/download/en/details.aspx?id=1491" mce_href="http://www.microsoft.com/download/en/details.aspx?id=1491" target="_blank"&gt;Tools Update&lt;/a&gt;) e o &lt;a href="http://msdn.microsoft.com/en-us/data/aa937723" mce_href="http://msdn.microsoft.com/en-us/data/aa937723" target="_blank"&gt;ADO.NET Entity Framework 4.1&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Cenário de uso deste caso&lt;/h3&gt;  &lt;p&gt;Durante o desenvolvimento da aplicação, recursos de produtividade como Scaffold Templates serão apresentados, e em cenários mais complexos com repositório de dados, injeção de dependência e etc, este exemplo não funcionará 100%, tornando-se necessária a edição do código gerado pelas ferramentas.&lt;/p&gt;  &lt;p&gt;Sendo assim, este cenário se aplicaca para casos onde temos um domínio mais simples, e não necessitamos de recursos como DI, IoC e etc.&lt;/p&gt;  &lt;h3&gt;Estruturando a aplicação&lt;/h3&gt;  &lt;p&gt;A organização de uma aplicação é indispensável, seja ela na fase de desenvolvimento ou na fase de suporte. Se tens uma aplicação bem estruturada e organizada, pode-se identificar e resolver problemas isoladamente e mais facilmente, e o mesmo vale para o desenvolvimento.&lt;/p&gt;  &lt;p&gt;Toda esta organização começa já na criação da solução (Solution) e organização dos projetos dentro da mesma.&lt;/p&gt;  &lt;p&gt;Particurlarmente organizo a aplicação como descrito na Figura 1 e Figura 2 abaixo, e isto varia de pessoa a pessoal e empresa a empresa.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_7B900B95.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_7B900B95.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4A92EB99.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4A92EB99.png" border="0" height="139" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 1 – Criando uma solução em branco.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Deste modo, a solution conterá 3 projetos, sendo eles:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;MvcFakeStore.Data (Adicionar pasta &lt;i&gt;“Contexts”&lt;/i&gt;)– Class Library &lt;/li&gt;    &lt;li&gt;MvcFakeStore.Domain (Adicionar pasta &lt;i&gt;“Entities”&lt;/i&gt;) – Class Library &lt;/li&gt;    &lt;li&gt;MvcFakeStore.Web – ASP.NET MVC 3 Web Application (Configurado como na &lt;b&gt;Figura 3&lt;/b&gt;) &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;Ao término das adições, a solução fica como mostrado na &lt;b&gt;Figura 2&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_37744F9E.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_37744F9E.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_31BBC6A9.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_31BBC6A9.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 2 – Solução com projetos criados.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_6A690167.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_6A690167.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_2B999B70.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_2B999B70.png" border="0" height="223" width="244"&gt;&lt;/a&gt;&amp;nbsp; &lt;br&gt;&lt;b&gt;Figura 3 – Configurações do projeto MvcFakeStore.Web.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Uma aplicação tem várias responsabilidades e divisões. Por exemplo, o acesso à dados é uma área de responsabilidade, as regras de negócio outra, e sendo assim, possuir um projeto separado para cada uma destas áreas pode facilitar o desenvolvimento e manutenção da aplicação.&lt;/p&gt;  &lt;p&gt;Desta forma, temos as seguintes separações:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Acesso à Dados: Representado pelo projeto MvcFakeStore.Data, que terá os contextos, inicializadores e etc. &lt;/li&gt;    &lt;li&gt;Domínio: Representado pelo projeto MvcFakeStore.Domain, que terá as classes representando as regras de negócio da aplicação. &lt;/li&gt;    &lt;li&gt;Interface: Representada pelo projeto MvcFakeStore.Web, que será a aplicação criada com ASP.NET MVC que o usuário acessará para manipular os dados. &lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Criando o Contexto&lt;/h3&gt;  &lt;p&gt;O contexto (Ou &lt;a href="http://en.wikipedia.org/wiki/Data,_Context_and_Interaction" mce_href="http://en.wikipedia.org/wiki/Data,_Context_and_Interaction" target="_blank"&gt;Data Context&lt;/a&gt;) será responsável pelo gerenciamento das sessões no banco de dados, mapeamento das tabelas para as classes e operações como leitura, escrita, alteração e exclusão de dados (Famos CRUD).&lt;/p&gt;  &lt;p&gt;Atualmente fala-se muito sobre orientação à objetos, DDD, ORMs, mas qual a grande vantagem disso? Antes usavamos DataSets e tudo era mais simples. De fato talvez fosse mais simples, mas junto aos dados do DataSet existia um XML que descrevia o que cada campo fazia, seu tamanho e outras informações, ou seja, era um banco de dados replicado na aplicação.&lt;/p&gt;  &lt;p&gt;Se temos todas estas definições já em nossas classes, não há esta necessidade, tornando assim objetos algo muito mais leve para se trafegar entre as camadas da aplicação. Existem outras enúmeras vantagens no uso de trafego de objetos ao invés de DataSet (ou DataTable) entre camadas, mas extenderia muito este post.&lt;/p&gt;  &lt;p&gt;Outro ponto é a constante mudança de escopo que sofremos durante o andamento do projeto, tornando mudanças no código algo frequente, resultado de falhas na análise de requisitos.&lt;/p&gt;  &lt;p&gt;Pensando em uma solução para este problema (Ninguém faz uma análise de requisitos perfeita), o correto é primeiramente ter um ponto único de atualização das regras de negócio no sistema, e isto é feito no domínio (Domnain), onde as classes que refletem o mundo real serão criadas. Partindo desta linha de racioncínio, temos o &lt;a href="http://en.wikipedia.org/wiki/Domain-driven_design" mce_href="http://en.wikipedia.org/wiki/Domain-driven_design" target="_blank"&gt;DDD&lt;/a&gt;, onde o desenvolvimento começa sempre pelo domínio (Criação das classes), e mantém o foco sempre nas regras de negócio.&lt;/p&gt;  &lt;p&gt;Para operações no banco de dados, o uso de Stored Procedures é comum, porém as Stored Procedures também contém regras de negócio, e se dissemos que criar um único ponto de atualização (Princípio &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" mce_href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" target="_blank"&gt;DRY&lt;/a&gt;), fica inviável ter que atualizar as classes da aplicação e também as Stored Procedures.&lt;/p&gt;  &lt;p&gt;O uso de ORM se encaixa justamente neste ponto, onde teremos o mapeamento de cada tabela do banco para uma classe na aplicação e as operações &lt;a href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" mce_href="http://en.wikipedia.org/wiki/Create,_read,_update_and_delete" target="_blank"&gt;CRUD&lt;/a&gt; sendo criadas em tempo de execução e de acordo com as regras de negócio definidas no domínio da aplicação, poupando assim tempo de desenvolvimento e foco no domínio.&lt;/p&gt;  &lt;p&gt;Dentro deste contexto apresentado, algo que sempre preocupa um time é o “custo de desenvolvimento” (Tempo) que algo leva para ser construído. Não adiantaria também colocar todos estes pontos acima citados em prática se os mesmos tomassem&amp;nbsp; um tempo que a equipe não possúi.&lt;/p&gt;  &lt;p&gt;Mapear todas as tabelas para as classes por exemplo seria algo trabalhoso (E chato), pois teria que criar um script para gerar o banco de dados e posteriormente as classes.&lt;/p&gt;  &lt;p&gt;Por estes motivos que temos os Frameworks ORM, que já fazem tudo isto sozinho (Mapeamento, criação de banco de dados, operações CRUS e etc.). Para este post utilizarei o Framework ORM da Microsoft, o ADO.NET Entity Framework, que se encontra na versão 4.1.&lt;/p&gt;  &lt;p&gt;O ADO.NET Entity Framework 4.1 já se encontra disponível no gerenciador de pacotes &lt;a href="http://nuget.codeplex.com/" mce_href="http://nuget.codeplex.com/" target="_blank"&gt;NuGet&lt;/a&gt; porém se estiver utilizando o ASP.NET MVC 3 já encontrará a opção “Add Package Library Reference” no projeto.&lt;/p&gt;  &lt;p&gt;Como descrito previamente, o contexto será alocado no projeto MvcFakeStore.Data, na pasta Contexts, então será necessário adicionar as referências ao mesmo, como na &lt;b&gt;Figura 4&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_136FA455.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_136FA455.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_5FC9C8A7.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_5FC9C8A7.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 4 – Adicionando um novo pacote ao projeto MvcFakeStore.Data.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Quando a janela de pacotes abrir, realize as operações como na &lt;b&gt;Figura 5&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_5F602663.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_5F602663.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_1CAB1DEF.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_1CAB1DEF.png" border="0" height="73" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 5 – Instalando o pacote Entity Framework.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;b&gt;Nota:&lt;/b&gt; É importante sempre verificar a versão do pacote que está sendo instalada, como mostrado na &lt;b&gt;Figura 5&lt;/b&gt;.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;b&gt;Nota:&lt;/b&gt; O gerenciador de pacotes utiliza o PowerShell 2.0, caso não possua (Meu caso com Windows XP SP3), baixe-o aqui.&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;&lt;i&gt;&lt;a href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=16818" mce_href="http://www.microsoft.com/download/en/details.aspx?displaylang=en&amp;amp;id=16818" target="_blank"&gt;Windows Power Shell 2.0&lt;/a&gt;&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;O erro recebido ao instalar o pacote quando não tem o Power Shell instalado está na &lt;b&gt;Figura 6&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_7C266EED.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_7C266EED.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_04A9CE38.png" style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_04A9CE38.png" border="0" height="175" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 6 –Erro ao instalar pacotes devido a falta do Windows Power Shell 2.0.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Com as referências adicionadas, criaremos duas classes:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;MvcFakeStoreContext – Gerenciará o contexto da aplicação.&lt;/li&gt;    &lt;li&gt;MvcFakeStoreContextInitializer – Gerenciará o inicio deste contexto e refletirá as atualizações do contexto no banco de dados.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;A &lt;b&gt;Figura 7&lt;/b&gt; ilustra a classe MvcFakeStoreContext.cs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_6A5D83EF.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_6A5D83EF.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_501FAB7C.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_501FAB7C.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 7 – Classe MvcFakeStoreContext.cs.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Nesta classe, importamos o namespace System.Data.Entity, responsável por manipular e mapear as futuras entidades do contexto, e em seguida herdamos do objeto DbContexto, que possui por exemplo os métodos CRUD.&lt;/p&gt;  &lt;p&gt;Precisamos agora de um inicializador, que aplicará as mudanças do contexto no banco de dados (Não queremos ficar criando scripts SQL para tudo que alterarmos no domínio).&lt;/p&gt;  &lt;p&gt;A &lt;b&gt;Figura 8&lt;/b&gt; ilustra a esta classe.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_169F2C36.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_169F2C36.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_1EB8E93C.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_1EB8E93C.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 8 – Classe MvcFakeStoreContextInitializer.cs.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Note que temos a herança de um objeto chamado “DropCreateDatabaseIfModelChanges” (Refazer o banco de dados se o domínio mudar), e poderiamos ter também o “DropCreateDatabaseAlways”, que re-criaria o banco toda vez que a aplicação rodasse.&lt;/p&gt;  &lt;p&gt;Além disso, ainda podemos sobrescrever alguns métodos nesta classe, mas faremos isto depois.&lt;/p&gt;  &lt;h3&gt;Criando o Domínio&lt;/h3&gt;  &lt;p&gt;O domínio é responsável pelas regras de negócio da aplicação, que serão representadas por objetos (Classes), e farão uso dos contextos para persistirem seus estados no banco de dados.&lt;/p&gt;  &lt;p&gt;Para simplificar este exemplo, criarei duas classes, sendo uma para persistir os produtos e outra para as categorias.&lt;/p&gt;  &lt;p&gt;As &lt;b&gt;Figuras 9 &lt;/b&gt;e &lt;b&gt;10&lt;/b&gt; exemplificam as classes mencionadas.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_17300A80.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_17300A80.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_0D0100C4.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_0D0100C4.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 9 – Classe Product.cs.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_3E8EFF0A.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_3E8EFF0A.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_790C8F8F.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_790C8F8F.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 10 – Classe Category.cs.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Até o momento somente classes simples foram criadas, e por hora elas não possuem relacionamento, validação e também não estão sendo mapeadas a nenhuma tabela do banco de dados (Que não foi criado ainda).&lt;/p&gt;  &lt;h3&gt;Relacionando as classes&lt;/h3&gt;  &lt;p&gt;O próximo passo é relacionar estas classes, aplicando assim regras de negócio à elas. Exemplo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Uma categoria pode conter muitos produtos;&lt;/li&gt;    &lt;li&gt;Um produto possúi apenas uma categoria;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Poderiamos criar relacionamentos mais complexos, de NxN, como mostrado aqui neste post: &lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/04/23/asp-net-mvc-e-ef-relacionamento-n-gt-n.aspx" mce_href="http://weblogs.asp.net/andrebaltieri/archive/2011/04/23/asp-net-mvc-e-ef-relacionamento-n-gt-n.aspx" target="_blank"&gt;ASP.NET MVC e EF–Relacionamento N–&amp;gt; N&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Para realizar estes relacionamentos é simples. Na classe Product.cs, criaremos uma propriedade do tipo inteiro, que representará o Id de uma categoria, e também criaremos um objeto do tipo Category, que representa a categoria cujo Id foi preenchido que que irá conter todos os dados (Não somente o Id) da categoria.&lt;/p&gt;  &lt;p&gt;Da mesma forma, na categoria, teremos uma lista de produtos, que serão os produtos que pertencem a esta categoria.&lt;/p&gt;  &lt;p&gt;Estas ligações (Objeto categoria na classe produto e lista de produtos na classe categoria) são feitas para facilitar ocarregamento e manipulação de dados no domínio, tornando possível a navegação também nos objetos filhos.&lt;/p&gt;  &lt;p&gt;Dúvida: &lt;i&gt;“Se eu tenho um objeto Nota Fiscal, que possúi 10 mil itens e cada item possúi uma composição de 10 ou mais peças, isto quer dizer que estarei carregando por volta de 100.000 objetos na memória ao carregar uma Nota Fiscal?”&lt;/i&gt;&lt;/p&gt;  &lt;p&gt;Resposta: Não necessáriamente. O Entity Framework possúi métodos inteligentes para carregar dados, onde um objeto filho só é carregado quando invocado. É o que chamamos de Lazy Load. Há um tempo atrás escrevi um artigo bem robusto sobre EF para o Linha de Código, acesse-o aqui: &lt;a href="http://www.linhadecodigo.com.br/artigo/2920/Descubra-o-ADONET-Entity-Framework.aspx" mce_href="http://www.linhadecodigo.com.br/artigo/2920/Descubra-o-ADONET-Entity-Framework.aspx" target="_blank"&gt;Descubra o ADO.NET Entity Framework&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Deste modo, as classes serão modificadas como nas &lt;b&gt;Figuras 11&lt;/b&gt; e &lt;b&gt;12&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_3CE35498.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_3CE35498.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_47399A5A.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_47399A5A.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 11 – Classe Product.cs com relacionamento para classe Category.cs.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_73E4E4E4.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_73E4E4E4.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_1C19AEA8.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_1C19AEA8.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 12 – Classe Category.cs com referência a classe Product.cs.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Em adicional temos o modificador Virtual em ambas propriedades que são de tipos complexos, isto permite que o EF sobrescreva estas propridades em tempo de execução e as preencha.&lt;/p&gt;  &lt;h3&gt;Decorando as classes&lt;/h3&gt;  &lt;p&gt;No início do post falei sobre DRY (Don’t Repeate Yourself) e as validações se encaixam bem neste princípio. Quando temos a regra de negócio toda no domínio, o ideal é que a validação dos dados também esteja lá. As validações também são regras de negócio, e se estamos concetrando as regras de negócio no domínio, criá-las na interface quebraria este escopo.&lt;/p&gt;  &lt;p&gt;O .NET Framework 4 conta com um recurso interessante, chamado de Data Annotations, que eu mostrei neste post: &lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/01/06/asp-net-mvc-valida-231-227-o-de-dados-modelo.aspx" mce_href="http://weblogs.asp.net/andrebaltieri/archive/2011/01/06/asp-net-mvc-valida-231-227-o-de-dados-modelo.aspx" target="_blank"&gt;ASP.NET MVC–Validação de dados [Modelo]&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;O ato de “decorar” as classes é a aplicação de atributos que tornam as classes mais ricas, fugindo do padrão ânemico de criação de classes como quando trabalhavamos com stored procedures.&lt;/p&gt;  &lt;p&gt;Os DataAnnotations possúem vários marcadores, porém não abordarei todos aqui. Para lista dos marcadores, consulte este post: &lt;a href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx" mce_href="http://msdn.microsoft.com/en-us/library/system.componentmodel.dataannotations.aspx" target="_blank"&gt;MSDN Namespace System.ComponentModel.DataAnnotations&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Por padrão não temos referência aos DataAnnotations, então será preciso adicionar a referência ao System.ComponentModel.DataAnnotations no projeto MvcFakeStore.Domain, como mostrado na &lt;b&gt;Figura 13&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_7475C32E.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_7475C32E.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_28AC7D26.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_28AC7D26.png" border="0" height="201" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 13 – Adicionando referência aos DataAnnotations.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Com a referência adicionada, decore as classes como abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_1C40EAAE.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_1C40EAAE.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_46AFAC7C.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_46AFAC7C.png" border="0" height="213" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 14 – Classe Product.cs decorada.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_161EBF75.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_161EBF75.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_36C819CB.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_36C819CB.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 15 – Classe Category.cs decorada.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Note que para os campos Virtual não coloquei como requerido, pois os mesmo serão preenchidos dinamicamente e sendo assim nunca seriam válidos.&lt;/p&gt;  &lt;h3&gt;Mapeamento das classes&lt;/h3&gt;  &lt;p&gt;Com os relacionamentos feitos e as classes decoradas, precisamos “mapear” as classes, que seria relacionar cada campo dela com um campo de uma tabela no banco de dados. Mas nem banco de dados temos ainda!!!&lt;/p&gt;  &lt;p&gt;Então deixa que o Entity Framework faz todo trabalho pra gente. Tudo que precisamos fazer é voltar ao contexto e criar os DbSets (Conjuntos de entidades) referente a cada classe que queremos persistir no banco. Simples né =)&lt;/p&gt;  &lt;p&gt;Para isso, modifique a classe MvcFakeStoreContext.cs (Não se esqueça de adicionar a referência ao projeto MvcFakeStore.Domain, pois as entidades estão lá) como indicado na &lt;b&gt;Figura 16&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_4430BD82.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_4430BD82.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4767C6CC.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4767C6CC.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;Figura 16 – Adicionando os DbSets para as classes do domínio.&lt;/p&gt;  &lt;p&gt;Por fim, para nossa classe MvcFakeStoreContextInitializer.cs (Nome pequeno né) não ficar vazia e até mesmo para exemplificar seu uso mais afundo, vamos sobrescrever o método Seed, que será resposável por alimentar a base de dados com alguma informação sempre que o banco fore recriado.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_2D96214E.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_2D96214E.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_6E5A8861.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_6E5A8861.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 17 – Método Seed do inicializador de contextos.&lt;/b&gt;&lt;/p&gt;  &lt;h3&gt;Criando os Controllers e Views com Scaffolding Templates&lt;br&gt;&lt;/h3&gt;  &lt;p&gt;Com o contexto e domínio criado, chega a hora de criar a interface (#TODOSCHORA). O ASP.NET MVC 3 Tools Update trouxe uma atualização incrível, onde todo código do controller e das views são criados automaticamente pelo Visual Studio, e para quem diz que tudo gerado veria uma “caixa-preta”, todo o código gerado pelos templates pode ser editado, desde o C# até o HTML com Razor;&lt;/p&gt;  &lt;p&gt;Antes de criar os controllers e views, não se esqueça de adicionar ao projeto MvcFakeStore.Web referências aos projetos MvcFakeStore.Domain e MvcFakeStore.Data. &lt;u&gt;&lt;b&gt;Também será necessário dar um build na aplicação&lt;/b&gt;&lt;/u&gt;.&lt;/p&gt;  &lt;p&gt;Com as referências adicionadas, clique com o botão direito sobre a pasta Controllers e selecione a opção Add -&amp;gt; Controller. A tela da &lt;b&gt;Figura 18&lt;/b&gt; se abrirá.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_75102295.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_75102295.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_5901F45B.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_5901F45B.png" border="0" height="164" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 18 – Configurando o template para criação do Controller e Views do produto.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Após clicar em Add, note que vários arquivos foram gerados, sendo eles um Controller (ProductController.cs e uma view para cada Action do controller, como mostrado na &lt;b&gt;Figura 19&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_7CBDACA6.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_7CBDACA6.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_745EF8B1.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_745EF8B1.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 19 – Arquivos gerados pelo template.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Repita o passo com a classe Category, como mostrado na &lt;b&gt;Figura 20&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_419182EE.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_419182EE.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_30ACDEFE.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_30ACDEFE.png" border="0" height="164" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 20 – Configurando o template para a categoria.&lt;/b&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Controller Name: Nome do controller, sempre no formato &amp;lt;prefixo&amp;gt; + Controller;&lt;/li&gt;    &lt;li&gt;Template: Temos três opções de template, sendo elas, vazio, com métodos CRUD já feitos e baseados no Entity Framework e com os métodos CRUD vazios.&lt;/li&gt;    &lt;li&gt;Model Class: Classe na qual as views irão se basear.&lt;/li&gt;    &lt;li&gt;Data Context: Contexto que criamos no projeto MvcFakeStore.Data.&lt;/li&gt;    &lt;li&gt;Views: Razor ou ASPX.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;i&gt;&lt;b&gt;Nota: A validação já está toda feita =D &lt;/b&gt;&lt;/i&gt;    &lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_493F0CFF.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_493F0CFF.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_41B62E43.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_41B62E43.png" border="0" height="145" width="244"&gt;&lt;/a&gt; &lt;/p&gt;  &lt;h3&gt;Rodando a aplicação&lt;/h3&gt;  &lt;p&gt;Antes de rodar a aplicação temos que acertar alguns pontos:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ConnectionString: Que indicará qual servidor a aplicação se conectará e criará o banco de dados (Sim, o banco será criado automaticamente).&lt;/li&gt;    &lt;li&gt;Global.asax: É o responsável por gerenciar o ciclo de vida da aplicação, então ao iniciar a aplicação informaremos o nosso inicializador de contextos (MvcFakeStoreContextInitializer).&lt;/li&gt;    &lt;li&gt;Links para a sessão de produtos e categorias.&lt;/li&gt;    &lt;li&gt;Setar o projeto Web como projeto inicial.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Para adicionar a connection string, abra o arquivo Web.Config da raiz do projeto MvcFakeStore.Web (Cuidado pois temos vários arquivos web.config em outras pastas como a pasta Views. Atente-se para abrir o da raiz), e adicione a connection string abaixo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_540185B6.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_540185B6.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_12F59703.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_12F59703.png" border="0" height="60" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 21 – Adicionando a connection string ao arquivo Web.Config.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Note que a connection string deve ter o mesmo nome do contexto que criamos (MvcFakeStoreContext).&lt;/p&gt;  &lt;p&gt;Para o Global.asax, adicione as referèncias aos namespaces System.Data.Entity e MvcFakeStore.Data.Contexts e no método Application_Start atribua o inicializador, como na &lt;b&gt;Figura 22&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_50195288.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_50195288.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_085A5A52.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_085A5A52.png" border="0" height="162" width="244"&gt;&lt;/a&gt;     &lt;br&gt;Figura 22 – Atribuindo o inicializador de contextos no Global.asax.&lt;/p&gt;  &lt;p&gt;Para “dar um tapa” no visual, altere o título da página e crie mais dois links (Um para produto e outro para categoria) na página inicial (_Layout.cshtml), como mostrado na &lt;b&gt;Figura 23&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_75A7F14B.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_75A7F14B.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_593020CD.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_593020CD.png" border="0" height="86" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 23 – Alterando o layout inicial da aplicação.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Por fim, torne o projeto MvcFakeStore.Web como o projeto inicial da solução, como mostrado na &lt;b&gt;Figura 24&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_3CB5BF9E.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_3CB5BF9E.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4BEEB91C.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_4BEEB91C.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 24 – Tornando o projeto MvcFakeStore.Web o projeto inicial da solução.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Depois deste passo, é só rodar a aplicação que terá este resultado:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Na página inicial temos o nome que alteramos, os links que criamos e um indicador marcando que não estmos logados na aplicação, como mostrado na &lt;b&gt;Figura 25&lt;/b&gt;.      &lt;br&gt;      &lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_3DB2D0DD.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_3DB2D0DD.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_23E12B5F.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_23E12B5F.png" border="0" height="58" width="244"&gt;&lt;/a&gt;       &lt;br&gt;&lt;b&gt;Figura 25 – Tela inicial.       &lt;br&gt;&lt;/b&gt;&lt;/li&gt;    &lt;li&gt;Na página de produtos não temos nenhum produto.&lt;/li&gt;    &lt;li&gt;Na página de categorias já temos uma categoria cadastrada, que é aquela adicionada no método Seed da classe MvcFakeStoreContextInitializer, como mostrado na &lt;b&gt;Figura 26&lt;/b&gt;.      &lt;br&gt;      &lt;br&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_07D2FD25.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_07D2FD25.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_3B9D8427.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_3B9D8427.png" border="0" height="145" width="244"&gt;&lt;/a&gt;       &lt;br&gt;&lt;b&gt;Figura 26 – Tela de categorias.       &lt;br&gt;&lt;/b&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;h3&gt;Autenticação e Autorização&lt;/h3&gt;Para finalizar com chave de ouro, como notamos, já possúimos um certo vínculo com o esquema de autenticação e autorização padrão do ASP.NET (Vide o identificador na &lt;b&gt;Figura 25&lt;/b&gt;).  &lt;p&gt;Deste modo, utilizaremos o membership do ASP.NET para autenticar e autorizar usuários na aplicação.&lt;/p&gt;  &lt;p&gt;O primeiro passo é executar o configurador do ASP.NET, como mostrado no &lt;b&gt;Figura 27&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_58A632EF.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_58A632EF.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_6053BD00.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_6053BD00.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 27 – Executando o configurador do ASP.NET.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Quando o site de configuração abrir, na aba Security, clique na opção Enable Roles. Deste modo poderemos criar perfis de usuários, e é isto que faremos, criando os três perfis abaixo:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Usuário – Acesso de leitura&lt;/li&gt;    &lt;li&gt;Funcionário – Leitura, Edição e Escrita.&lt;/li&gt;    &lt;li&gt;Administrador – Leitura, Edição, Escrita e Exclusão.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Adicione então os três roles clicando dobre o link “Create or Manage Role”, como mostrado na &lt;b&gt;Figura 28&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_46821782.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_46821782.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_75D61DBD.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_75D61DBD.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 28 – Criação dos roles.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;De volta a aba Security, criaremos três usuários para testar, como mostrado na &lt;b&gt;Figura 29&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_39ACE2C6.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_39ACE2C6.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_7B49AFC3.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_7B49AFC3.png" border="0" height="145" width="244"&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_6CA1948F.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_6CA1948F.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_401AF55A.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_401AF55A.png" border="0" height="145" width="244"&gt;&lt;/a&gt; &lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_0D4D7F97.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_0D4D7F97.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_27B0035F.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_27B0035F.png" border="0" height="145" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 29 – Criando os usuários e atrelando-os aos perfis.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;h3&gt;Autorizando as ações dos Controllers&lt;/h3&gt;  &lt;p&gt;Após os usuários criados, aplicaremos as ações nos controllers, tudo através de notações, legível e simples, como mostrado nas &lt;b&gt;Figuras 30 &lt;/b&gt;e &lt;b&gt;31&lt;/b&gt;.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_3922F4E8.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_3922F4E8.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_65D0D023.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_65D0D023.png" border="0" height="244" width="215"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 30 – Decorando o controller ProductController.cs&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Note que informamos no método Authorize, os Roles separados por virgula que podem acessar aquela ação. Como o método index lista todos os produtos, não requeri nenhum tipo de autorização/autenticação á ele, permitindo que qualquer usuário o acesse.&lt;/p&gt;  &lt;p&gt;Já para o método Delete, eu informo que somente administradores podem exlcuir um produto.&lt;/p&gt;  &lt;p&gt;O mesmo vale para a &lt;b&gt;Figura 31&lt;/b&gt;, que exemplifica o controller CategoryController.cs.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/andrebaltieri/image_127C1AAE.png" mce_href="http://weblogs.asp.net/blogs/andrebaltieri/image_127C1AAE.png"&gt;&lt;img src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_6AD82F34.png" style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" alt="image" mce_src="http://weblogs.asp.net/blogs/andrebaltieri/image_thumb_6AD82F34.png" border="0" height="221" width="244"&gt;&lt;/a&gt;     &lt;br&gt;&lt;b&gt;Figura 31 – CategoryController.cs decorado com autorizações.&lt;/b&gt;&lt;/p&gt;  &lt;p&gt;Ufa, e assim termina a aplicação. Ainda tem rotas e areas, mas fica para um próximo artigo. Espero que este seja útil.&lt;/p&gt;  &lt;h3&gt;Conclusão&lt;/h3&gt;  &lt;p&gt;Em pouco tempo e com pouco conhecimento podemos criar aplicações simples e até arriscar algumas aplicações mais complexas. O ASP.NET MVC junto com o EF são muito produtivos e apesar do ASP.NET MVC gerar boa parte (Para não dizer todo) do código, temos total liberdade para alterá-lo.&lt;/p&gt;  &lt;p&gt;Por fim, temos recursos como Membership, herdado do ASP.NET que facilitam ainda mais a nossa vida.&lt;/p&gt;  &lt;h3&gt;Downloads&lt;/h3&gt;  &lt;p&gt;&lt;a href="http://downloads.insidedotnet.com.br/20110614_MvcFakeStore.zip" mce_href="http://downloads.insidedotnet.com.br/20110614_MvcFakeStore.zip" target="_blank"&gt;Código Fonte&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;nbsp;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;André Baltieri     &lt;br&gt;MSN:&lt;/b&gt; andrebaltieri@hotmail.com | &lt;b&gt;Twitter: &lt;/b&gt;@andrebaltieri    &lt;br&gt;&lt;b&gt;Blog:&lt;/b&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri" mce_href="http://weblogs.asp.net/andrebaltieri"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Inside .NET User Group Leader   &lt;br&gt;&lt;a href="http://www.insidedotnet.com.br/" mce_href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Learn MVC   &lt;br&gt;&lt;a href="http://learn-mvc.net/" mce_href="http://learn-mvc.net/"&gt;http://learn-mvc.net/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7829772" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 3" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+3/default.aspx" /></entry><entry><title>ASP.NET MVC Error 404 Handling</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/05/21/asp-net-mvc-error-404-handling.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/05/21/asp-net-mvc-error-404-handling.aspx</id><published>2011-05-21T21:35:05Z</published><updated>2011-05-21T21:35:05Z</updated><content type="html">&lt;h3&gt;Introdução&lt;/h3&gt;  &lt;p&gt;Neste vídeo eu mostro rapidamente como podemos configurar uma aplicação para redirecionar um usuário para uma tela de erros personalizada.&lt;/p&gt;  &lt;p&gt;Para este caso, utilizei o erro 404, mas outros erros como 505 seguem o mesmo caminho.&lt;/p&gt;  &lt;p&gt;Acesse o vídeo no site do Learn MVC: &lt;a title="http://learn-mvc.net/Watch/10" href="http://learn-mvc.net/Watch/10"&gt;http://learn-mvc.net/Watch/10&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;b&gt;André Baltieri      &lt;br /&gt;MSN:&lt;/b&gt; andrebaltieri@hotmail.com | &lt;b&gt;Twitter: &lt;/b&gt;@andrebaltieri     &lt;br /&gt;&lt;b&gt;Blog:&lt;/b&gt; &lt;a href="http://weblogs.asp.net/andrebaltieri"&gt;http://weblogs.asp.net/andrebaltieri&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Inside .NET User Group Leader    &lt;br /&gt;&lt;a href="http://www.insidedotnet.com.br/"&gt;http://www.insidedotnet.com.br/&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Learn MVC    &lt;br /&gt;&lt;a href="http://learn-mvc.net/"&gt;http://learn-mvc.net/&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7798985" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 3" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+3/default.aspx" /><category term="ASP.NET MVC" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC/default.aspx" /></entry><entry><title>ASP.NET MVC e EF–Relacionamento N–&gt; N</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/04/23/asp-net-mvc-e-ef-relacionamento-n-gt-n.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/04/23/asp-net-mvc-e-ef-relacionamento-n-gt-n.aspx</id><published>2011-04-23T21:20:00Z</published><updated>2011-04-23T21:20:00Z</updated><content type="html">Várias pessoas vem me perguntando sobre relacionamentos do tipo N para N com o ORM ADO.NET Entity Framework e resolvi fazer este post exemplificando dois cenários básicos de relacionamentos N para N. Criei dois cenários simples, mas a medida que dúvidas forem aparecendo, podem comentar aqui mesmo....(&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/04/23/asp-net-mvc-e-ef-relacionamento-n-gt-n.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7769219" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 3" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+3/default.aspx" /><category term="ASP.NET MVC" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC/default.aspx" /></entry><entry><title>Deploy de aplicações ASP.NET MVC 3 (Final)</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/04/17/deploy-de-aplica-231-245-es-asp-net-mvc-3-final.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/04/17/deploy-de-aplica-231-245-es-asp-net-mvc-3-final.aspx</id><published>2011-04-17T19:27:00Z</published><updated>2011-04-17T19:27:00Z</updated><content type="html">Há um tempo atrás escrevi este post sobre como publicar aplicações ASP.NET MVC 3 (http://weblogs.asp.net/andrebaltieri/archive/2010/11/18/publishing-asp-net-mvc-3-rc1-applications.aspx – em inglês), e neste pequeno post irei abordar o que mudou no deploy das aplicações ASP.NET MVC 3 nesta versão final....(&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/04/17/deploy-de-aplica-231-245-es-asp-net-mvc-3-final.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7761988" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author><category term="ASP.NET MVC 3" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC+3/default.aspx" /><category term="ASP.NET MVC" scheme="http://weblogs.asp.net/andrebaltieri/archive/tags/ASP.NET+MVC/default.aspx" /></entry><entry><title>ASP.NET MVC Custom Binders</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/03/29/asp-net-mvc-custom-binders.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/03/29/asp-net-mvc-custom-binders.aspx</id><published>2011-03-29T23:40:00Z</published><updated>2011-03-29T23:40:00Z</updated><content type="html">Durante discussões com o @felipeoriani e com o @joseroberto sobre a questão de manter os controllers mais limpos (Que também foi muito bem abordada pelo @pedroreys no MVC Summit 2011), resolvi criar este post para mostrar a utilidade/utilização dos Custom Binders.

Os binders são os responsáveis por preencher uma entidade apartir de uma View, e sendo assim, podemos extendê-los e criar binders customizados. Um exemplo interessante foi o que o Phil Haack fez durante o Webcamp aqui no Brasil, onde ele criou um binder customizado para valores decimais: http://haacked.com/archive/2011/03/19/fixing-binding-to-decimals.aspx
...(&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/03/29/asp-net-mvc-custom-binders.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7738175" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author></entry><entry><title>ASP.NET MVC Summit 2011</title><link rel="alternate" type="text/html" href="http://weblogs.asp.net/andrebaltieri/archive/2011/03/27/asp-net-mvc-summit-2011.aspx" /><id>http://weblogs.asp.net/andrebaltieri/archive/2011/03/27/asp-net-mvc-summit-2011.aspx</id><published>2011-03-27T17:35:00Z</published><updated>2011-03-27T17:35:00Z</updated><content type="html">Ontem (Sábado, 25 de Março de 2011) aconteceu o ASP.NET MVC Summit 2001, evento online que reuniu grandes feras do ASP.NET MVC para palestrar.

O evento foi organizado pelo @vquaiato e pelo @vcavalcante e contou com mais de 1800 inscrições. Durante as palestras houveram picos de 200 pessoas online em cada trilha.
...(&lt;a href="http://weblogs.asp.net/andrebaltieri/archive/2011/03/27/asp-net-mvc-summit-2011.aspx"&gt;read more&lt;/a&gt;)&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7734652" width="1" height="1"&gt;</content><author><name>andrebaltieri</name><uri>http://weblogs.asp.net/members/andrebaltieri.aspx</uri></author></entry></feed>