Estaba escribiendo el post de la próxima semana, y me he dado cuenta que no había hablado antes de cómo integrar Unity con ASP.NET MVC y Web API. Realmente, no puede ser más sencillo.

Integrando Unity con ASP.NET MVC

Para que ASP.NET MVC resuelva las dependencias de los Controller a través de Unity, sólo tenemos que instalar el siguiente paquete de nuget:

PM> Install-Package Unity.MVC

 

Este paquete creará dos archivos, UnityConfig y UnityMvcActivator. En UnityConfig configuraremos las dependencias como ya vimos en este post, es en UnityMvcActivator dónde realmente ocurre la acción:

Esta clase realiza las siguientes acciones:

  1. Se registra para ejecutarse al inicio de la aplicación:
  2. Obtiene la configuración del contenedor de Unity lo registrar como el DependencyResolver por defecto para MVC:

Y listo! Ya tenemos Unity integrado con ASP.NET MVC, ahora cada vez que ASP.NET MVC instancie un nuevo controller, lo hará a través de Unity resolviendo todas sus dependencias.

El ciclo de vida

Aunque ya hemos configurado Unity para resolver las dependencias, todavía tenemos que tomar alguna decisión más. En este momento tenemos un contenedor que devolverá las mismas instancias para todas las peticiones que se realicen. Por tanto, tendremos que gestionar el estado entre peticiones y almacenarlo por nuestra cuenta (por ejemplo mediante HttpContext).

Sin embargo, lo habitual en MVC es que creemos las instancias junto con el controller, el cuál se crea una vez por cada request, olvidándonos de esta forma de gestionar el estado.

En Unity, podemos controlar el ciclo de vida de las instancias utilizando un LifeTimeManager, Unity viene con diferentes LifeTimeManager, pero ninguno mantiene un ciclo de vida por Request. Por eso el paquete de Nuget incluye un LifeTimeManager para MVC, PerRequestLifeTimeManager.

Para configurarlo tenemos que descomentar la siguiente líne en UnityWebActivator, que registrará un módulo para mantener un ciclo de vida por Request:

Este código configurará un nuevo HttpModule , el cuál gestionará automáticamente el ciclo de vida de las dependencias, siempre que las registremos con un PerRequestLifeTimeManager en UnityConfig:

Integrando Unity con ASP.NET Web API

Integrar Unity en ASP.NET Web API es muy similar a hacerlo con ASP.NET MVC, con el siguiente paquete de nuget:

PM> Install-Package Unity.AspNet.WebApi

 

Este paquete creará dos archivos UnityConfig y UnityWebApiActivator, que funcionan igual que en ASP.NET MVC. Este es el contenido de UnityWebApiActivator:

El código es muy parecido al de ASP.NET MVC, tras solicitar un contenedor de Unity configurado, se registra como DependencyResolver por defecto para Web API.

La diferencia principal está en la configuración necesaria para la gestión del Ciclo de Vida. A diferencia de ASP.NET MVC no es necesario utilizar un HttpModule para gestionar el ciclo de vida por Request, ASP.NET Web API permite integrarse con las implementaciones propias de cada IOC gracias a que la interfaz de IDependencyResolver incluye un nuevo método BeginScope.

De este modo Unity puede proporcionar una implementación que se encargue de la gestión del ciclo de vida utilizando una implementación propia del framework IOC, en este caso, utilizando el HierarchicalLifeTimeManager de Unity.

Tan sólo es necesario descomentar la siguiente línea:

Al registrar la nueva instancia sólo tenemos que indicar que queremos utilizar el HierarchicalLifeTimeManager:

WebActivator

No conocía esta librería hasta trabajar con los paquetes de Unity en Nuget. Ambos paquetes de Nuget tienen la necesidad de que las clases encargadas de la activación se ejecuten al inicio de la aplicación. Una opción sería modificar el archivo global.asax, y en el caso de MVC dónde la implementación necesita registrar un módulo, además modificar el archivo web.config.

Para evitar modificar los archivos de configuración, ambos paquetes utilizan la librería WebActivator, que les permite definir sin modificar los archivos de configuración métodos que se ejecutarán en las diferentes fases de inicio de una aplicación web, con una simple declaración a nivel de ensamblado:

Una funcionalidad muy interesante, especialmente para crear otros paquetes. El paquete se puede instalar desde nuget:

PM> Install-Package WebActivatorEx

 

Os leo!