{tecnologia, conceitos, negócios, idéias, práticas, .NET, ruby, osx, ios e algo mais}
02/02/2011
Fala galera o post de ontem sobre DependencyResolver foi um pouco mais pesado(e burro) não? Mostrei como criar um Service Locator bem pobre e o código ficou um pouco pesado ruim mesmo.A idéia é mostrar que não precisamos cair na tentação de resolver tudo por nós mesmos, que temos já boas soluções de mercado preparadas para nos auxiliar.
Como dissemos o ASP.NET MVC 3 conta com a interface IDependencyResolver para atuar como um Service Locator. O Ninject é um injetor de dependências open source, ou podemos chamá-lo também de container de IoC/DI. Estou falando do Ninject pois ele já possui uma implementação de IDependencyResolver que podemos utilizar e facilitar infinitamente nossas vidas.
É óbvio que isso tudo já está disponível com o NuGet, então vamos digitar o seguinte comando no Package Manager Console:
Install-Package Ninject.MVC3
Feito isso teremos as referências do Ninject e Ninject.MVC3 adicionadas ao nosso projeto. Teremos também um arquivo criado, com o código abaixo:
using System.Web.Mvc;
using Ninject;
using Ninject.Mvc3;
[assembly: WebActivator.PreApplicationStartMethod(typeof(ExemploDependencyResolver.AppStart_NinjectMVC3), "Start")]
namespace ExemploDependencyResolver{
public static class AppStart_NinjectMVC3 {
public static void RegisterServices(IKernel kernel) { }
public static void Start() {
// Create Ninject DI Kernel
IKernel kernel = new StandardKernel();
// Register services with our Ninject DI Container
RegisterServices(kernel);
// Tell ASP.NET MVC 3 to use our Ninject DI Container
DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));
}
}
}
Este código está pronto para utilizarmos. Ele configura o Ninject como sendo nossa implementação de IDependencyResolver e já configura o mesmo para o ASP.NET MVC. Tudo que precisamos fazer é registrar nossas dependências utilizando o código da linha 13. Algo mais ou menos assim:
public static void RegisterServices(IKernel kernel){
kernel.Bind<idependencia1>().To<dummydependencia1>();
kernel.Bind<idependencia2>().To<dummydependencia2>();
}
Pronto! Isso é tudo que precisamos! Não precisamos nem alterar o Global.asax para adicionar o DependencyResolver, pois esta classe criada pelo pacote do NuGet já faz esse trabalho.
Vimos que trabalhar com injeção de dependências em nossos controllers no ASP.NET MVC 3 é algo bastante trivial e simples quando utilizando o DependencyResolver. Se trabalharmos com Ninject então essa tarefa fica praticamente inexistente, afinal só precisamos configurar umas poucas linhas com a resolução das dependências.Chega de sofrer com soluções mirabolantes não é?!
Confira o código fonte deste segundo exemplo aqui no github: http://github.com/vquaiato/MVC3DependencyResolver
Abraços,
Vinicius Quaiato.