quinta-feira, 18 de outubro de 2012

ASP.NET MVC Areas

Eai Caros "Encodes"  (...)
Estava a pensar nesses dias sobre um novo assunto para compartilhar com vocês e veio a mente um problema que tive algum tempo atrás em uma arquitetura web que estou trabalhando e resolvi compartilhar pois fiz varias pesquisas achei bons tutorias sobre o assunto porém a maioria deles em inglês, não é algo muito complicado porém se você nunca necessitou desse tipo de arquitetura e está disposto a implementar algo parecido vai perceber que fica um pouco chato no começo e muito simples e organizado de se trabalhar no passar do tempo do projeto.
Falando do "problema" necessariamente, quando você está trabalhando em um padrão de projeto em dotnet  mais especificamente MVC 3 que é o meu caso, você possui um padrão que o próprio visual studio cria para você ... seria mais ou menos assim:

 (OBS: apenas um parentes como você pode ver eu estou utilizando a versão 2012 do VS e apenas para nível de aprendizado e percepção de mudanças criei um projeto MVC4 mas para o assunto que estamos abordando não vai mudar nada praticamente na implementação)
Voltando (...)

Como pode ver existe o padrão de pastas CONTROLLERS, MODELS, VIEWS e o Global.asax este por sua vez é de extrema importância num projeto MVC pois ele é responsável pela manipulação de eventos e do ciclo de vida da aplicação. Basicamente ele contém uma tabela de rotas que é criada ao iniciar o aplicativo, mais detalhes sobre você pode dar uma lida no site oficial:
http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/asp-net-mvc-routing-overview-cs
até ai estava tudo certo até que comecei a perceber que no projeto em que estou locado iria ter um problema de organização dessas pastas pois não iria ter apenas um conceito de regra dentro da hierarquia do projeto, deixando isso mais claro simulei apenas para nível conceitual um diagrama demonstrando esse possível ambiente:

Seria mais ou menos essa a ideia, como você pode ver tenho um site principal aonde o acesso seria publico sendo mais detalhista seria acessado por qualquer usuário sem nenhuma autenticação, porém os outros módulos seria de acesso especifico apenas para usuários credenciados e também devemos considerar que seria desenvolvido por uma equipe diferente. Foi nessa ideia que partir a pesquisar e verifiquei que o dotnet tem algo chamado de AREA. É dessa forma que ele representa os subdomínios da sua aplicação, com isso você poderia tranquilamente simular esse ambiente que colocamos a seguir tendo nele uma arquitetura de pastas na mesma visão do MVC porém dividido por áreas ficando assim muito mais organizado e limpo o desenvolvimento (...)
Pra você que curti uma vídeo aula:
http://www.asp.net/mvc/videos/mvc-2/how-do-i/aspnet-mvc-2-areas

Chega de "historinha" hehe, para não perder o costume, sirva-se de um belo café e vamos codar, irei mostras as alterações que implementei com base nesse diagrama e também a tela principal com alguns ActionLink fazendo o roteamento para as outras áreas.
Inicialmente esta seria a arquitetura já criada:

 Perceba que o visual studio já criou pra você classes de "Registros" separadamente. Isso quer dizer que quando o Global.asax for registrar a aplicação verá que necessita também de registrar as áreas separadamente (...)
Global.asax:

   // Note: For instructions on enabling IIS6 or IIS7 classic mode,   
   // visit http://go.microsoft.com/?LinkId=9394801  
   public class MvcApplication : System.Web.HttpApplication  
   {  
     public static void RegisterRoutes(RouteCollection routes)  
     {  
       routes.IgnoreRoute("{resource}.axd/{*pathInfo}");  
       routes.IgnoreRoute("{*favicon}", new { favicon = @"(.*/)?favicon.ico(/.*)?" });  
     }  
     protected void Application_Start()  
     {  
       AreaRegistration.RegisterAllAreas();  
       FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);  
       RouteConfig.RegisterRoutes(RouteTable.Routes);  
     }  
   }  


As classes "PosVendaAreaRegistration.cs", "LojaAreaRegistration.cs", "FinanceiroAreaRegistration.cs" foram criadas automaticamente pelo VS quando criei a AREA.


Apenas na classe "PrincipalAreaRegistration.cs" fiz uma pequena alteração dizendo quem seria a pagina "ROOT" do projeto basicamente seria a pagina que será chamada inicialmente ao abrir a aplicação.

   public class PrincipalAreaRegistration : AreaRegistration  
   {  
     public override string AreaName  
     {  
       get  
       {  
         return "Principal";  
       }  
     }  
     public override void RegisterArea(AreaRegistrationContext context)  
     {  
       context.MapRoute("Root", "", new { controller = "Publico", action = "Index", id = UrlParameter.Optional });  
       context.MapRoute(  
         "Principal_default",  
         "Principal/{controller}/{action}/{id}",  
         new { action = "Index", id = UrlParameter.Optional }  
       );  
     }  
   }  

O trecho de codigo "context.MapRoute()" mapea o root da pagina que por sua vez aponta para o controller "Publico" e a View "Index" do projeto, ao executar a aplicação o resultado seria esse:
Como pode ver eu já implementei os links que irão chamar os outros módulos, perceba que ao clicar em cada um deles o roteamento é feito para a sua respectiva área chamando o "CONTROLLER" indicado no ActionLink, veja o fonte da Index:

 @{  
   Layout = null;  
 }  
 <!DOCTYPE html>  
 <html>  
 <head>  
   <meta name="viewport" content="width=device-width" />  
   <title>Index</title>  
 </head>  
 <body>  
   <div style="text-align:center">  
     <h2>Domínio Público</h2>  
     @Html.ActionLink("Area - Financeira", "Index", "Home", new { area = "Financeiro" }, null)  
     <br />  
     @Html.ActionLink("Area - Loja de Produtos", "Index", "Home", new { area = "Loja" }, null)  
     <br />  
     @Html.ActionLink("Area - Pós Venda", "Index", "Home", new { area = "PosVenda" }, null)  
   </div>  
 </body>  
 </html>  

Sem mistérios !  =))
Uma visão bastante interessante desse tipo de arquitetura seria o compartilhamento de _layouts e informações entres os "SITES" a grosso modo podemos ter uma percepção que temos vários ambientes de site dentro de apenas um, facilitando a manutenção e futuras melhorias no mesmo.
É isso ...
Espero ter ajudado.
Um abraço!

Nenhum comentário:

Postar um comentário