Introdução

Nesta série de artigos sobre ASP.NET MVC você irá descobrir o mundo do desenvolvimento de aplicações web extensíveis. Cada artigo apresenta um ponto extensível do framework ASP.NET MVC e ao final dessa série você irá ter os conhecimentos práticos de como implementar aplicações extensíveis com ASP.NET MVC. Você pode pegar todo o código fonte discutido nesse artigo no Projeto Jambo no Codeplex.

Agenda

Você está curioso sobre o conteúdo dos artigos? Se sim, saiba quais serão os tópicos abordados:

  • Por quê MVC?
  • Conheça MVC Areas
  • Implemente um Plug-in
  • Implemente o Host
  • Implemente Temas
  • Carregue Controllers com MEF

Por que MVC?

Iniciamos nossa jornada citando algumas vantagens de usarmos MVC como framework de desenvolvimento em cima do ASP.NET.

  • ASP.NET MVC fornece muito mais opções de extensibilidade e controle sobre o HTML gerado do que ASP.NET Web Forms. Com MVC você ganha muito mais controle sobre o ciclo de vida de uma requisição e a habilidade de substituir várias pecinhas do framework (ViewEngines, ControllersFactory, Routing e etc.).
  • MVC é um padrão que permite que seu aplicativo cresça horizontalmente, você pode adicionar novos recursos sem que os novos códigos afetem os códigos criados anteriormente.
  • MVC é um design pattern que separa claramente as responsabilidades. Se você quiser alterar a cara do seu aplicativo, basta focar o seu esforço nas Views e assim por diante.

Conheça MVC Areas

Prosseguimos explorando pontos de extensibilidade. AreaRegistration é uma classe extremamente simples que possui um “Nome” e métodos associados a registrar a área. Uma AreaRegistration representa uma parte menor do seu aplicativo e facilita o crescimento horizontal do mesmo.

image

Observe na imagem acima que podemos colocar lado a lado Areas Registrations sem que interfiram nos códigos existentes.

Implemente um Plug-in

O nosso planejamento inclui demonstrações práticas alternadas com conteúdo teórico. Nossas demos consistem em desenvolver um aplicativo que possa aceitar plugins e nessa primeira parte do nosso aplicativo codificaremos o plug-in.

Antes de codificarmos nosso plug-in vou levantar algumas características que irão nortear nosso desenvolvimento:

  • Plug-in independente do host. Nosso aplicativo deve ter a capacidade de ser desenvolvido e executado sem dependências do Host.
  • Fácil de desenvolver e testar. Queremos que o plug-in seja desenvolvido com as mesmas ferramentas que temos para desenvolver programas para a web.
  • Empacotável. A publicação do plug-in deve gerar um pacote.
  • Fácil de instalar. O plug-in deve ter instalação simplificada.

Para implementarmos o nosso plug-in devemos desenvolver nosso aplicativo MVC normalmente. Nesse artigo eu criei uma MVC Application para gerenciar posts e comentários. Vejam a estrutura de pastas:

image

E adicionarmos uma AreaRegistration. Nessa demonstração adicionamos a implementação BlogRegistration:

public class BlogRegistration : AreaRegistration
{
    public override string AreaName
    {
        get
        {
            return "Blog";
        }
    }

    public override void RegisterArea(AreaRegistrationContext context)
    {
        context.MapRoute(
            "Blog_default",
            "Blog/{controller}/{action}/{id}",
            new { controller = "Post", action = "Index", id = UrlParameter.Optional }
        );
    }
}

Vejam que essa classe só possui um nome e um método para acrescentar os roteamentos.  Um outro detalhe importante, queremos que quando o nosso aplicativo seja exportado, ele tenha embutido todas as Views em uma única dll. Para conseguirmos incorporar a View precisamos selecionar o Build Action como Embedded Resource.

image

Quando nós usamos essa técnica é conveniente modificarmos nossos controladores para procurar as Views dentro da dll. O comportamento padrão é esse:

image

E para conseguirmos que o controlador acesse a View embutida. Precisamos adicionar as classes AssemblyResourceProvider e AssemblyResourceVirtualFile:

image

Essas classes capturam as requisições no formato “~/Plugins/Blog.dll/Blog.Views.{0}.{1}.aspx” onde o {0} é o nome do Controlador e o {1} é o nome da Action. E por isso precisamos acessar nossas Views no controlador passando todo o caminho.

Download

Você pode baixar toda a solução hospedada no projeto Jambo no Codeplex.