Microsoft Unity : Inyección de dependencias .NET
Hace poco tuve la suerte de participar en un proyecto de construcción de una solución corporativa con tecnología Java. En ese proyecto pude por fin tocar el famoso Spring Framework.
En el corazón de SPRING consiste en un componente(contendor) que facilita el empleo del patrón de arquitectura Inyección de dependencias(ID). Este patrón ampliamente en el desarrollo de aplicaciones empresariales en JAVA.
El patrón ID tiene como objetivo lograr el desacoplamiento(reducir dependencias) de componentes de una aplicación. El desacoplamiento ofrece múltiples ventajas, entre ellas:
- facilidad para desarrollo Test-driven development (TDD),
- facilidad para realizar cambios en la aplicación sin afectar su estabilidad,
- flexibilidad para la exención de la aplicación,
- facilidad para introducir servicios trasversales.
He seleccionado algunos de artículos referentes a ID que explican en detalle las ventajas del uso del patrón:
El desacoplamiento se logra introduciendo un componente(Contenedor de ID) que es el responsable de instanciar clases, inicializarlos y devolver sus instancias a la aplicación cliente.
La aplicación cliente solo maneja Interfaces y no tiene dependencia de una implementación concreta de las clases que utiliza. Cuando la aplicación cliente necesita obtener un componente(un servicio) ya instanciado, lo hace solicitándolo al contenedor por medio de un "localizador"
Otra de ventajas es que al delegar la ceración de los objetos en un contendor, se puede tener controlado en un único punto el ciclo de vida de los objetos(en su momento conceptos similares estaban implementados en el Microsoft Transaction Servicer). Por otro lado este contendor puede servir/representar el contexto de la aplicación, este contexto se puede "cachear", almacenar o distribuir.
En su día ya comente que en .NET existía varios frameworks que implementaban el patrón ID, entre todos creo que tiene mucho sentido revisar las posibilidades del Microsoft Unity(actualmente esta en su versión 1.2).
Este biblioteca forma parte de las famosas Enterprice Library en su versión 4.1 .
Microsoft define Unity como "The Unity Application Block (Unity) is a lightweight extensible dependency injection container with support for constructor, property, and method call injection."
Unity se puede utilizar por separado sin otros bloques de EntLib, podemos descargar Unity en MSDN.
Además existe una versión de Unity para Silverlight:
http://www.microsoft.com/downloads/details.aspx?familyid=0991CEDB-953A-4367-A2B6-071E31766B4C&displaylang=en
Si descargamos MS Unity nos encontramos con en el código fuente de la biblioteca, los binarios, ejemplos de uso y un fichero de ayuda con todo lo necesarios para comenzar el uso de la biblioteca.
A continuación un pequeño ejemplo muy básico de como se trabaja con Unity.
//El contenedor
IUnityContainer myContainer = new UnityContainer();
..
// Retrieve logger type name from configuration
String loggerName = ConfigurationManager.AppSettings["LoggerName"].ToString();
ILogger myLogger = myContainer.Resolve<ILogger>(loggerName);
En este un fragmento,una aplicación utiliza un Logger, la aplicación no sabe nada de la implementación y no tiene dependencia de la clase que implementa el Logger, solo conoce el interfase ILogger.
Obtiene la instancia de Logger pediéndolo al Contenedor y apoyándose en una configuración que almacena la referencia a la implementación de la clase blogger(podríamos cambiar el Logger sin tener que recompilar la aplicación solo cambiando la configuración).
El empleo de esta biblioteca puede ser bastante útil!!!!!, ¿alguien ha tenido alguna experiencia con esta biblioteca o similares?