Artigo do tipo Tutorial
Recursos especiais neste artigo:
Contém nota Quickupdate, Conteúdo sobre boas práticas, Conteúdo sobre Engenharia,
Artigo no estilo Curso Online

Integrando Spring.NET com NHibernate e ASP.MVC - Parte 2
Nesta segunda e última parte desta série, veremos um cenário de aplicação que se aproxima do mundo real, aplicando integração entre o Spring.NET, o NHibernate e o ASP.NET MVC. Nesta aplicação, são apresentados exemplos da criação de um cenário, onde usaremos dois padrões, bastante comuns no mercado, Facade e DTO, além de realizar toda a configuração do Spring em arquivos separados de configuração, aumentando assim a organização de nosso projeto.


Em que situação o tema é útil

Com a aplicação dos conceitos apresentados neste artigo o leitor conhecerá como o Spring.NET pode atuar em mais de uma camada de forma estável e funcional, comprovando que o mesmo pode ser útil aos nossos projetos, indo além da Injeção de Dependências, permitindo que tenhamos mais flexibilidade para controlar todo o ciclo de vida da aplicação. Com isso o leitor terá como benefício o aumento da testabilidade de suas aplicações, assim como uma queda no acoplamento e aumento na coesão da mesma.

Na edição anterior iniciamos uma série de artigos sobre integração do Spring.NET com outros frameworks do mercado. Foi apresentado um comparativo entre o NHibernate e o Spring Data, que internamente têm uma implementação do NHibernate até a versão 3.2, demonstrando as diferenças entre ambos, no que diz respeito à produtividade e controle da aplicação.

O Spring.NET é um dos gigantes do mundo dos frameworks, voltados para .NET, inspirado na sua versão para Java, sendo que ele por si só já representa um universo enorme de possibilidades e ganhos para nossos projetos, porém não se limita a isso, fornecendo mecanismos de integração com outros gigantes do mundo .NET, como, o NHibernate e o ASP.NET MVC.

O Spring MVC nos permite obter ganhos de produtividade quando integrado ao ASP.NET MVC, aliando o poder do Spring.NET com a robustez do ASP.NET MVC. Destacando que a adoção do Spring MVC em projetos traz as seguintes vantagens:

· Interface IDependencyResolver, que normalmente é implementada diretamente pelo ASP.NET MVC, passa a ser implementada pelo Spring.NET, que realiza ainda a Injeção de Dependências em Controllers, ActionFilters e outros tipos utilizados no ASP.NET MVC, facilitando a componentização e execução da aplicação, de forma serializada e melhor gerenciada. O Spring MVC torna esta implementação simples para suas aplicações MVC, registrando seus objetos, sejam Controllers, ActionFilters e afins, no arquivo de configuração do Spring.NET, dentro das suas respectivas configurações, como descrito nos próximos capítulos. Este registro fará com que o ASP.NET MVC tire proveito de toda a infra-estrutura disponibilizada pelo Spring MVC, quando esse for executado.

· Uso de escopo para objetos Web. Estes objetos quando registrados dentro dos padrões do Spring MVC, podem ter seu comportamento definido em escopos, sendo que cada um dos escopos representa uma forma distinta de criação de objetos na Views e nos Controllers.

Para demonstrar a facilidade de implementação do Spring MVC, diante do ASP.NET MVC, se apresentado um exemplo. Supondo que em um projeto MVC, existe uma página chamada CadastrarCliente.aspx, que acessa uma camada de negócios através da Classe de Negócio ManterCliente e que para a realização do cadastro utilize o método CadastraCliente. A Listagem 1 mostra um exemplo de implementação deste cenário, em um controller do ASP.NET MVC.

Listagem 1. Controller comum em ASP.NET MVC


  01 public class ClienteController : Controller {    
  02   public ActionResult CadastrarCliente(ClienteModel cliente){
  03       RegistrarCliente business = new RegistrarCliente(); 
  04       //Implementação de cliente
  05       ...      
  06       business.RegistraCliente(cliente);
  07       ...
  08       return View("CadastrarCliente");
  09   }
  10 }

Na linha 03, da Listagem 1, temos a criação de nossa classe, que representa a implementação da regra de negócio da aplicação, enquanto que na linha 06 temos a execução desta regra, com a execução do método RegistraCliente. Vale destacar que para utilizar qualquer objeto é necessária a clausula new para instanciar os mesmos.

A Listagem 2 traz um exemplo de implementação do mesmo controller, com o Spring MVC. Vale ressaltar que para isso todas as configurações do Spring devem ser realizadas previamente, porém veremos estas configurações detalhadamente a frente, nos limitando agora a visualizar as diferenças entre a implementação final, ASP.NET MVC puro e Spring.MVC.

Listagem 2. Controller gerenciado pelo Spring MVC


  01 public class ClienteController : Controller {    
  02   public ManterCliente business {get; set;} 
  03   public ActionResult CadastrarCliente(ClienteModel cliente){  
           //Implementação de cliente
  05       business.RegistraCliente(cliente);       
           return View("CadastrarCliente");
  06   }
  07  }

Observando a Listagem 2, pode se notar uma diferença na declaração da propriedade da linha 02. Esta propriedade será a responsável por receber a Injeção de Dependências via Spring,NET, da classe ManterCliente. Já dentro do Controller, verificamos que a propriedade business está instanciada e sendo utilizada sem a necessidade da clausula new. Um ponto importante neste trecho é que foi efetuada a implementação de um objeto gerenciado pelo Spring.NET, não sendo preciso utilizar a interface IApplicationContext para chamar business e implementar uma classe estática, para utilizar como ServiceLocator como visto no artigo sobre Spring.NET, na edição 103, pois o componente do Spring que agora controla tais requisições não é mais o Spring.Core, mas o Spring.web.mvc, possibilitando o funcionamento destes recursos através da implementação correta na classe da propriedade a ser injetada e da configuração destes objetos no arquivo Web.config.

Na parte prática, veremos todas as implementações realizadas como exemplo e informações de configuração. Sendo satisfatória a implementação do componente MVC do Spring, visto que é mais fácil de implementar do que o Spring.NET, na integração com webForms, por exemplo, onde se deve registrar a página .aspx, como um objeto no arquivo de configuração e depois poder usufruir da Injeção de Dependências e outras facilidades do Spring.NET.

Escopo para Objetos gerenciados pelo Spring MVC

Os escopos (ou estados) são formas de comportamento de um objeto gerenciado pelo Spring, que fará com que os objetos instanciados tenham um comportamento específico dentro do domínio da aplicação, mais precisamente Controllers e Views. Estes escopos se dividem em:

· Application (Aplicação): é o escopo padrão, usado em todos os objetos onde não existe escopo definido no arquivo de configuração. Este escopo cria uma instância única de um objeto dentro do Servidor de Aplicação durante a sua execução, caso o Servidor de Aplicação seja reiniciado, este objeto será automaticamente eliminado da memória do mesmo. Objetos desta natureza têm o mesmo comportamento que um singleton em sua aplicação padrão.

· Session (Sessão): é o escopo em que é criada uma instância de objeto a cada solicitação, sendo que cada instância criada será utilizada junto com uma instância da classe HttpSession. Session é o recomendável para objetos que controlam carrinhos de compras, perfis de usuários, ou seja, dados que precisam ser mantidos ao longo de algumas requisições.

· Request (Requisição/Pedido): é o escopo que cria uma instância de objeto a cada solicitação HTTP efetuada pela aplicação, ou seja, cada POST ou cada Refresh. Quando o método IApplicationContext.GetObject for executado, irá retornar a mesma instância do objeto enquanto durar a requisição HTTP. Isso faz com que se possa injetar como, o mesmo objeto em múltiplas páginas, para assim efetuar uma nova solicitação.

...

Quer ler esse conteúdo completo? Tenha acesso completo