Luis Baigorria – Software Developer

Acquire Wisdom and Live with Passion

Contenedor de Inversión de Control – Unity 3.0 para ASP.NET MVC

leave a comment »

Saludos.

Continuamos con los contenedores de inversión de control, en esta oportunidad nos vamos a centrar en Unity.mvc, el contenedor oficial de Microsoft creado por el equipo Patterns & Practices para proyectos ASP.NET MVC.

Instalación

Para instalar el componente usamos Nuget, ya sea desde la interfaz gráfica o la consola de instalación.

 PM> Install-Package Unity.mvc

Una vez finalizada la instalación del paquete podemos ver que se han creado un par de archivos en la carpeta App_Start: UnityConfig.cs y UnityMvcActivator.cs. En el primero de ellos encontramos la configuración de contenedor, el punto en el que registraremos nuestras clases e interfaces para posteriormente usarlas en la resolución de dependencias. En UnityMvcActivator.cs, se encuentra el código de inicialización específico de la integración para ASP.NET MVC, usando el componente WebActivatorEx, una útil herramienta que permite introducir módulos de forma dinámica, durante el arranque.

Registro de componentes

El registro de interfaces y clases se lo realiza sobre el contenedor Unity. Para ello, nos dirigimos al archivo UnityConfig.cs e implementarlo de la misma forma que siempre:

public static void RegisterTypes(IUnityContainer container)
{
 // container.LoadConfiguration();
 
 // TODO: Registrar los tipos aqui
 
 container.RegisterType<IUnitOfWork, UnitOfWork>(new TransientLifetimeManager(), 
 new InjectionConstructor(connectionString.ConnectionString));

 // container.RegisterType<IUsuariosRepository, UsuariosRepository>();
 // container.RegisterType<IMascotasRepository, MascotasRepository>();
 
 container.RegisterType<IUsuariosAppServices, UsuariosAppServices>(new ContainerControlledLifetimeManager());
 container.RegisterType<IMascotasAppServices, MascotasAppServices>("SingletonMascota", new ContainerControlledLifetimeManager());
 container.RegisterType<FuenteDigital>(new ContainerControlledLifetimeManager(), 
 new InjectionProperty("Id", objeto.Id), new InjectionProperty("Name", objeto.Name));

}

Así podemos ir registrando cuantos pares interfaz-clase necesitemos en la aplicación.

Instancias Per request

Una de las características importanes en Unity 3.0 y su integración con MVC es la gestión del ciclo de vida de las instancias per request. Los que antes se tenia que pensar en vincular las instancias a un contenedor padre usando HierarchicalLifetimeManagers o sobrescribir manualmente el método Dispose() para que éste fuera liberado una vez termine la petición, ahora podemos ir al grano registrando los componentes y/o clases de forma PerRequestLifetimeManager, con esto hacemos que las instancias sean únicas por cada request o petición, ahorrando recursos y/o memoria.

public static void RegisterTypes(IUnityContainer container)
{
 // container.LoadConfiguration();
  container.RegisterType<IUsuariosRepository, UsuariosRepository>(new 
   PerRequestLifetimeManager());
  container.RegisterType<IMascotasRepository, MascotasRepository>(new 
   PerRequestLifetimeManager());
}

Para que esto sea posible y las instancias sean liberadas correctamente al finalizar la petición, en el archivo UnityMvcActivator.cs que Nuget ha dejado en la carpeta App_Start:

public static void Start() 
{
 var container = UnityConfig.GetConfiguredContainer();
 //....
 //....

 // TODO: Uncomment if you want to use PerRequestLifetimeManager
 // Microsoft.Web.Infrastructure.DynamicModuleHelper.DynamicModuleUtility
 // .RegisterModule(typeof(UnityPerRequestHttpModule));
}

Simplemente descomentamos la llamada a RegisterModule() del final y las instancias serán liberadas al finalizar la petición de forma automática, lo que antes lo hacíamos con los Dispose(), ahora Unity nos ahorra el trabajo de hacerlo automáticamente.

Convenciones

Otras de las características importantes que tiene Unity 3.0 son las convenciones, el poder registrar los componentes basándonos en convenciones es mucha dosis, nos ahora bastante trabajo a la hora de hacer el mantenimiento. Para lograr ésto, debemos decirle a Unity que debe usar la convención de nombrado para interfaces y clases con nombres equivalentes, aquí un ejemplo:

public static void RegisterTypes(IUnityContainer container)
{
 container.RegisterTypes(
 AllClasses.FromAssemblies(typeof(MvcApplication).Assembly),
 WithMappings.FromMatchingInterface,
 WithName.Default, 
 WithLifetime.Custom<PerRequestLifetimeManager>
 );
}

Con ésto ya no tendremos que asociar mil interfaces del tipo IMyComponent a la clase MyComponent. Por supuesto, estas convenciones son configurable y puedes conocer mas en el sitio oficial de Unity.

Espero esta publicación te sirva como una introducción al contenedor Unity, sin duda puedes encontrar ejemplos avanzado en la pagina oficial, lo importante es que vayas conociendo algunas herramientas que facilitan el proceso y gestión del ciclo de vida de los componentes.

Saludos.

Written by Luis Alberto

26/09/2016 a 9:11 PM

Publicado en Artículos, ioc, Microsoft, UIBASOFT

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

A %d blogueros les gusta esto: