Há algum tempo atrás escrevi um post aqui no blog falando sobre “Injeção de dependência”. Naquela ocasião, apresentei os benefícios da abordagem e alguns outros aspectos. Desta forma, para seguir com a leitura deste post, se você não possuir os conhecimentos equivalentes, recomendo fortemente a leitura do mesmo, disponível através deste link.
Hoje, pegando o gancho no assunto apresentado na ocasião em que o referido post foi escrito, gostaria de apresentar uma das formas que tem sido mais utilizadas nos projetos de software escritos em .NET mercado a fora: ID (Injeção de Dependência) com Ninject. Para este post, estou assumindo que você possua conhecimentos sobre ASP.NET MVC e C#, já que os exemplos que apresentarei foram implementados em uma aplicação MVC. Sobre estes dois assuntos, você pode encontrar bons conteúdos também aqui no site ( 🙂 ), basta seguir este link. Se esta série não bastar, recomendo o livro apresentado no link a seguir: livro ASP.NET MVC 4.
Sobre o Ninject
O site oficial do Ninject define o produto como:
Ninject is a lightweight dependency injection framework for .NET applications. It helps you split your application into a collection of loosely-coupled, highly-cohesive pieces, and then glue them back together in a flexible manner. By using Ninject to support your software’s architecture, your code will become easier to write, reuse, test, and modify.
De forma resumida, podemos dizer que Ninject é um container que facilita a escrita de códigos desacoplados em aplicações .NET. O resultado da utilização de ferramentas como Ninject, provavelmente resultará em aplicações mais coesas, de fácil manutenção e com alto índice de reutilização.
O que faremos aqui?
De forma geral, quando se fala em injeção de dependência, a grande maioria dos desenvolvedores .NET tendem a assustar-se (talvez um dia ainda entenderei o porque) com o tema. Assim, afim de ajudar este grupo de profissionais a desmitificar e desmistificar este assunto, criaremos um fragmento de exemplo real (carregaremos dados assincronamente para uma listagem), utilizando o conceito de ID com Ninject.
Mãos a obra
O primeiro passo consiste na criação de um projeto ASP.NET MVC 5 (em meu caso, estou utilizando o Visual Studio 2013, mas o exemplo pode ser reproduzido com tranquilidade em projetos MVC 4 ou 3 com Visual Studio 2012 ou 2010). Não vou descrever este processo por imaginar que você possui domínio sobre ele :-).
Na sequência, iremos acoplar via NuGet o container do Ninject ao nosso projeto. Para isso, basta dirigir-se até o menu superior principal no Visual Studio e navegar até a opção “Tools” > “Library Package Manager” > “Package Manager Console” e na linha de comandos, digitar “Install-Package Ninject -Version 3.0.1.10“. Ao concluir a instalação, você visualizará duas pequenas mudança em seu projeto: a adição das DLL’s “Ninject”, “Ninject.Web”, “Ninject.Web.Common” e “Ninject.Web.Mvc” assim como, a adição do arquivo “NinjectWebCommon.cs” no diretório “App_Start”, conforme apresentam as Figuras 1 e 2.
Figura 1. DLL’s adicionadas pelo NuGet
Figura 2. Classe “NinjectWebCommon.cs” adicionada pelo NuGet
Chamo a atenção neste ponto, para o arquivo “NinjectWebCommon”, adicionado na pasta “App_Start”. Esta classe (NinjectWebCommon) será a responsável por equacionar as definições de nossas interfaces para com nossas classes de repositório. Esta ideia ficará mais clara na medida em que formos apresentando os códigos.
Pronto, o Ninject já está pronto para ser utilizado. O que farei agora, é criar um diretório chamado “Interfaces” em minha solution e em seu interior, adicionarei uma nova interface, chamada “IRepositorioGeneral”. Em seu interior, adicionarei a assinatura de um método (lembre-se, estamos trabalhando com interfaces 🙂 ), “RetornaQuatroVideosMaisRecentes”. A Figura 3 apresenta a interface adicionada ao diretório “Interfaces” e a Listagem 1 apresenta o código final de nossa interface.
Figura 3. Adicionando a interface
Listagem 1. Exibindo o código da interface “IRepositorioGeneral”
O próximo passo consiste na criação do repositório. Desta forma, adicionarei um novo diretório a minha solution, chamado sugestivamente de “Repository”. Em seu interior, adicionarei uma nova classe, chamada “Repository_General.cs”. Como você já deve estar imaginando, na classe “Repository_General”, daremos vida ao método “RetornaQuatroVideosMaisRecentes”. A Listagem 2 apresenta o código completo da classe de repositório, enquanto a Figura 4 apresenta a classe recém adicionada.
Figura 4. Repositório adicionado
Listagem 2. Implementação do repositório
Alguns aspectos importantes do código apresentado pela Listagem 2:
- Na primeira linha implementamos a interface “IRepositoryGeneral” e “IDisposable”, através do caracter “:”. Claro que isso é preciso, uma vez que precisamos ligar as classes de alguma forma.
- Estamos trabalhando em um exemplo real e portanto, como temos uma conexão com o banco de dados (para a busca dos vídeos cadastrados), criamos métodos destrutores para encerrar a conexão quando não se fizer mais necessária.
- Na sequência implementamos o método “RetornaQuatroVideosMaisRecentes”. Note que estamos retornando uma lista de “VideosRetornados”. Vale ressaltar que, “VideosRetornados” trata-se de uma classe DTO. Não entrarei nos detalhes sobre o por que da implementação neste modelo mas, para que tudo funcione, é preciso implementar suas propriedades: “_Titulo”, “_CaminhoImagem” e “_LinkExterno”. Sugiro a criação de um diretório “ViewModel” para agrupar classes deste tipo.
Muito bem. Estamos quase lá! Precisamos agora, ligar os pontos (entenda-se, interface + repositório) e isso deve ser feito através da classe Ninject mencionada anteriormente neste post, isto é, “NinjectWebCommon”. Para isso, execute o referido arquivo e na sequência, no interior do arquivo, procure o método com a seguinte assinatura: “private static IKernel CreateKernel()“. Em seu interior, adicione a linha de código apresentada pela Listagem 3.
Listagem 3. Método onde deve ser realizada a amarração
Uma observação válida neste ponto é, é aqui onde as dependências são amarradas para que o Ninject possa gerenciar, desta forma, você deverá utilizar o interior deste método para realizar esta tarefa sempre que preciso.
Finalmente, como último passo, vamos ao nosso controller. É lá que poderemos ver a ID funcionando de forma adequada. Adicionei no interior do diretório “Controllers”, uma nova classe controladora chamada “Principal”. Em seu interior, criei uma nova action, chamada “CarregarVideosMaisRecentes”. Sua função é unicamente retornar os vídeos em formato JSON para a view, entretanto, para que isso ocorra, há uma dependência direta para “Repository_General” (lembra? o método que conecta no banco e retorna a lista de vídeos está lá!). É em situações deste tipo que o Ninject torna-se “uma mão na roda” :-).
A Listagem 4 apresenta o código completo para a classe controladora.
Listagem 4. Injetando dependência via Ninject no controlador
Em relação ao código apresentado pela Listagem 4, vale observar a presença do atributo “[Inject]”, decorando a propriedade que dará origem ao objeto. Ele é quem faz a sincronia dos elementos em tempo de execução. Legal, não?!
Restaria agora construir a view, que poderia receber este retorno em formato JSON através de uma chamada assíncrona com Ajax, por exemplo e tudo estaria funcionando. Mas como este não é o objetivo deste post, fica como desafio fazer isso acontecer ;-).
Era isso. Forte abraço a todos!
Facebook
Twitter
Instagram
LinkedIn
RSS