Primeros avances del proyecto ASM

Saludos a todos.

Hace varios días que inicie el desarrollo del proyecto ASM – Agentes Salvavidas de Mascotas, he aquí los primeros avances del proyecto (v0.1.0) para que puedas tener una idea del estado actual. Ya sabes, si quieres ser parte de este proyecto y colaborar en cualquiera de las partes, puedes escribirme en Facebook o pasarme un mensaje directo en en Twitter @uialberto

estadoasm

Recordarte que el proyecto es totalmente #opensource y se encuentra alojado en GitHub, cuando desees puedes darte una vuelta y ver el estado actual de avance.

Una vez finalizado el desarrollo de todos los issues de la versión 0.1.0, prepararé un vídeo en mi canal de #Youtube o un hangouts para comentarte sobre los componentes usados y la experiencia del mismo.

Saludos

 

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

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.

Contenedor de Inversión de Control – IoC Container

En esta oportunidad quiero compartirles sobre los contenedores de inversión de control (IoC Containers). Uno de los puntos a tomar en cuenta durante el desarrollo de sistemas es reducir el acoplamiento entre componentes, mientras mas bajo sea éste, menos esfuerzo realizamos durante el proceso de integración de los mismos, además estar preparados ante cualquier cambio que puedan surgir.  Uno de los principios SOLID que nos ayudan para lograr este objetivo es el Principio de Inversión de Dependencia y las técnicas de Inyección de Dependencias, acompañados con los magníficos contenedores de inversión de control.

Un Contenedor de Inversión de Control (IoC Container) es un componente especializado en la creación de instancias de objetos, así como en la gestión del ciclo de vida éstas, en términos simples es una clase encargada de suministrarnos las instancias que necesitemos en nuestra aplicación y olvidar sus dependencias hacia otras clases. ¡Fabuloso!. Nos olvidamos de los molestos «new» cada vez que necesitemos una instancia de alguna clase, por supuesto requiere una configuración inicial donde registramos todas las clases.

Los contenedores de inversión de control se apoyan en dos conceptos muy importantes Inyección de Dependencia e Inversión de Control, muchos creen que son lo mismo pero son dos conceptos diferentes que comparten cosas en común.

Inyección de Dependencia (DI)

  • Es un patrón de diseño que consiste en hacer que nuestras piezas de Software sean independientes.
  • Se refiere a la forma de como implementar el patrón IoC.
  • Se refiere a la forma de como los objetos consumidores reciben sus dependencias

Inversión de Control (IoC)

  • Patrón de diseño que coadyuva al bajo acoplamiento entre componentes de un sistema o una aplicación.
  • Los objetos consumidores no crean los objectos ayudantes, de los que depende. Estos son creados por un contenedor (Ejem: Unity Conteiner), que inyectará las dependencias. Útil para implementar un sistema enfocado a un diseño orientado a componentes.

Ahora vamos a ver uno de los contenedores mas usados dentro de la plataforma .NET, si aún no lo conoces es momento de hacerlo e iniciar el desarrollo de tus proyectos usando esta herramienta.

Unity (By Microsoft)

Éste IoC Container fue creado por Microsoft Pattern & Practices.

unity

Unity tiene licencia MS-PL Licence. Fue escrito por Chris Tavares y su “Kernel” está basado en ObjectBuilder.

Aquí puedes ver como puedes iniciar la configuración del contenedor y registrar las clases.

public class Bootstrapper
{
private IUnityContainer unityContainer;
public Bootstrapper()
{
unityContainer = new UnityContainer();
unityContainer.RegisterType<IPasswordCipher, Pbkdf2PasswordCipher>(new ContainerControlledLifetimeManager());
unityContainer.RegisterType<IPasswordCipherFactory, Pbkdf2PasswordCipherFactory>(new ContainerControlledLifetimeManager());
var cipherPassword = unityContainer.Resolve<IPasswordCipher>();
var cipherPasswordFactory = unityContainer.Resolve<IPasswordCipherFactory>();
// Usamos los objetos instanciados
var cifrado = cipherPassword.Encryp("password");
}
}

Si bien este es un ejemplo sencillo, mas adelante estaré compartiendo las distintas configuraciones que puedes realizar, inyectar constructor y la configuración de los tiempos de vidas de los objetos.

Espero sea de utilidad y puedas aplicarlos en tus proyectos.

Saludos y hasta pronto.