Hace pocas semanas, se publicaba la nueva versión de la Enterprise Library, la versión 6. Con muchísimas novedades, la primera que nos lanzamos a probar fue Unity 3. Durante esta semana nuestro compañero del metal Alberto Lafarga, se puso a indagar que podíamos aprovechar de esta nueva versión. Gracias crack! 😉

Qué es Unity Application Block

Unity, es un contenedor de inyección de dependencias. Existen muchos otros muy conocidos en la comunidad .NET, StructureMap, NInject, …

Unity forma parte de la Enterprise Library como un application block más. De hecho la propia Enterprise Library hace un uso extensivo de él para gestionar sus dependencias.

¿Por qué actualizamos a Unity 3?

En aquellas aplicaciones en las que utilizamos un IOC como contenedor para administrar nuestras dependencias e inyectarlas, siempre durante el arranque de nuestra aplicación tenemos un conjunto de clases que se encargar de declarar estas dependencias, algo así:

En un proyecto grande este conjunto de clases, por muy organizadas que ésten, pueden acabar siendo muy muy grandes, y al final volver inmanejables. Para que os hagais una idea este era el tamaño de una de nuestras clases para configurar los repositorios:

repositories

Y todavía nos quedaban muchas más dependencias por declarar!

En Unity 3…

Revisando las novedades de Unity 3 encontramos la solución a este problema. Como ya hacían otras librerías IOC antes que él, Unity 3 permite hacer “Auto-Registration“, lo que nos permite configurar las dependencias en base a un conjunto de convenciones que definamos.

Para ello, disponemos de una API Fluent que nos permite definir las convenciones en las que nos basaremos para registrar nuestros tipos.

En nuestro caso, queríamos mapear automáticamente todos los tipos que heredan de nuestro repositorio base (BaseRepository<T>) y que utilizan la nomenclatura estándar para implementar interfaces (ISomethingRepository -> SomethingRepository). De esta forma, todos los nuevos tipos de repositorio que añadamos en un futuro se registraran automáticamente.

Por supuesto, podemos combinar las convenciones automáticas con las explicitas para aquellos tipos que deben comportarse de forma diferente.

Gracias a esta nueva API hemos reducido el código y el mantenimiento posterior necesario para configurar nuestras dependencias, la clase final queda así:

Podéis descargaros la última versión de Unity desde nuget, o descargarlo aquí:

PM> Install-Package Unity