Olá pessoal, dando continudade aos artigos sobre injeção de dependência (e inversão de controle), neste post pretendo mostrar de forma rápida como trabalhar com um container de dependências no ASP.NET MVC. Conforme os artigos anteriores, os exemplos utilizarão o Microsoft Unity.
Até a versão 2 no ASP.NET MVC, para resolver dependencias em nossos Controllers era necessário modificar a Controller Factory padrão (responsável por criar os controllers) do Asp.Net MVC herdando da classe DefaultControllerFactory e sobreescrevendo o método GetControllerInstance. Já na versão 3, este processo ficou mais fácil pois foi incorporada uma nova interface chamada IDependencyResolver que visa resolver dependencias de Controllers (onde podemos utilizar um container de dependencias para isto), veja sua declaração:
public interface IDependencyResolver {
object GetService(Type serviceType);
IEnumerable<object> GetServices(Type serviceType);
}
Conhecendo esta interface, podemos realizar uma implementação básica junto a um container do Unity:
public class UnityDependencyResolver : IDependencyResolver
{
private IUnityContainer container;
public UnityDependencyResolver(IUnityContainer container)
{
this.container = container;
}
public object GetService(Type serviceType)
{
if (!container.IsRegistered(serviceType)) {
if (serviceType.IsAbstract || serviceType.IsInterface) {
return null;
}
}
return container.Resolve(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return container.ResolveAll(serviceType);
}
}
Uma vez tendo uma implementação desta interface e um container com todas as dependencias registradas, podemos seta-la como a “resolvedora” de dependencias em nosso projeto no arquivo global.asax no evento Application_Start, veja abaixo:
//declaração de nosso container de dependencias
private static UnityContainer _container;
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
// criando nosso container de dependencias e registrando uma dependencia de exemplo.
_container = new UnityContainer();
_container.RegisterType(typeof (IPersonRepository), typeof (PersonRepository));
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
//modificando o DependencyResolver para a nossa customização passando o container.
DependencyResolver.SetResolver(new UnityDependencyResolver(this._container));
}
protected void Application_End()
{
// ao finalizar a aplicação, libera o container
if (_container != null)
_container.Dispose();
}
No exemplo acima, criamos um container do unity e registramos um dependencia de um repositorio simples como exemplo. Na última linha, do método Application_Start, informamos ao DependencyResolver através do método SerResolver que nossa classe UnityDependencyResolver (implementação de IDependencyResolver) será nossa “resolvedora” de dependencias. Com isso, quando um controller necessitar de um dependencia (seja via construtor ou propriedade) ela será resolvida pela DependencyResolver.
Veja abaixo uma imagem do momento que um controller é instanciado e sua dependencia sendo resolvida com um repositório simples.

Repare que o controller depende do tipo de uma interface que está registrada no container do unity e o tipo concreto que é instanciado é o respectivo ao registro no container.
Caso você queira dar uma olhada nos fontes do ASP.NET MVC 3, e ver como a controller factory utiliza uma instância de IDependencyResolver para trabalhar, clique aqui e entenda melhor como este processo funciona.
Espero que gostem e ajudem em seus projetos.
Abraços.