Inyección de Dependencia con Spring.Net
Spring.Net es uno de los frameworks más conocidos para implementar Inyección de Dependencia (también conocido como Inversión de Control -IoC). Otros que nos permiten hacer este trabajo son: PicoContainer, ObjectBuilder, Windsor Container.
Basicamente, qué queremos lograr? Fácil, crear nuestros objetos, sin importar quién me provea la implementación.
En vez de hacer esto:
(1) Cliente obj_cliente = new Cliente();
Podemos hacer esto:
(2) ICliente obj_cliente = (ICliente) AppContext.Instance.GetObject(“Cliente”);
Expliquemos, en (1) le estamos diciendo a obj_cliente quién va a crearlo: new Cliente(); Es decir, le estamos diciendo quien le va a proveer de la implementación, y nunca vamos a poder cambiar esto, a menos que lo hagamos y volvamos a compilar. En (2) es distinto, estamos pidiendo una implementación, pero no sabemos quien nos la va a dar. Solo sabemos que quién nos proveea la construcción, va a implementar la interfaz ICliente. AppContext es un wrapper que hice para crear un singleton del contexto de toda la aplicación (está en el codigo fuente que se puede descargar más abajo).
El lugar donde le decimos qué clase se va a encargar de la implementación, es en el app.config (en una de las tantas lineas para configurar Spring.Net):
<object name=â€Cliente†type=â€Entities.Cliente, Entities†singleton=â€falseâ€/>
En esta lÃnea de código Entities.Cliente es la Clase que nos proveerá la implementación, y Entities es el assembly (que TIENE que estar en la carpeta de salida, donde está el .exe). También podemos ver cuan fácil es implementar un singleton de esta manera, solamente escribiendo singleton=”true” (ú obviandolo, es el valor por defecto), entonces no tenemos que hacerlo programaticamente.
Para el ejemplo lo que hice es organizar los proyectos de esta forma:
Lo que hariamos normalmente es referenciar Entities desde todas las partes del proyecto, en vez de esto, lo haremos con Entities.Contracts que contienen las interfaces, de modo que siempre programaremos contra las interfaces, nunca contra la implementación. Los proyectos no poseen relación de conocimiento con Entities, en ningún momento se lo referencia.
El tip del dÃa: Hay que programar contra las interfaces.
Descargar codigo fuente [Proyecto hecho con SharpDevelop]
Donde más podemos utilizarlo ? En la capa de acceso a datos, podrÃamos persistir los objetos con db4o, y en otra implementación lo podrÃamos hacer usando NHibernate! Y esto lo lograrÃamos creando una interfaz IBaseRepository que tenga metodos como Guardar, Eliminar, Buscar y luego crear las implementaciones para cada uno de los providers por ejemplo BaseRepositoryDb4o y BaseRepositoryNH.
Espero que sirva!