Igual que hice en otro post con Ninject, voy a hacer un ejemplo de cómo usas Inyección de Dependencias con Unity.
Unity es una librería que viene dentro de Enterprise Library 5.0, que os podéis descargar desde aquí. Recomiendo que os bajéis la versión con código fuente, ya que en caso de errores siempre la podréis debugar.
Como en el ejemplo con Ninject, creamos un proyecto de consola, en este caso se llamará DI_Unity, y añadimos las siguientes referencias:
Microsoft.Practices.Unity Microsoft.Practices.Unity.Configuration System.Configuration
Esta última la utilizaremos para leer del fichero de configuración la implementación que queramos usar, pero me estoy adelantando, vamos primero a por el código.
Añadimos al proyecto los siguentes elementos:
– Interfaz IRepository
namespace DI_Unity { interface IRepository { string GetData(); bool Save(); } }
– Clases SQLRepository y OracleRepository, que son las que implementan la interfaz IRepository.
class SQLRepository : IRepository { #region IRepository Members public string GetData() { return "GetData from SQLRepository"; } public bool Save() { return true; } #endregion }class OracleRepository : IRepository { #region IRepository Members public string GetData() { return "GetData from OracleRepository"; } public bool Save() { return false; } #endregion }– Clase MyService, que es la que recibe la inyección de dependencias.
class MyService { private readonly IRepository _repository; public MyService(IRepository repository) { _repository = repository; } public string GetData() { return _repository.GetData(); } public bool Save() { return _repository.Save(); } }– App.config, en este fichero definiremos qué implementación vamos a usar cuando se necesite un objeto de tipo IRepository.
<?xml version="1.0" encoding="utf-8" ?> <configuration> <configSections> <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/> </configSections> <unity xmlns="http://schemas.microsoft.com/practices/2010/unity"> <alias alias="IRepository" type="DI_Unity.IRepository, DI_Unity" /> <namespace name="DI_Unity" /> <assembly name="DI_Unity" /> <container name="repository"> <register type="IRepository" mapTo="SQLRepository"/> </container> </unity> </configuration>Como podéis ver, en el fichero de configuración declaramos un tipo IRepository y un elemento <container> en el que se especifica qué clase mapea a IRepository en tiempo de ejecución.
Ahora vamos a la clase Program.cs para hacer una llamada a nuestro servicio:
using System; using Microsoft.Practices.Unity; using Microsoft.Practices.Unity.Configuration; namespace DI_Unity { class Program { static void Main(string[] args) { // Carga el container "repository" donde declaramos la implementación // de IRepository que queremos utilizar IUnityContainer container = new UnityContainer(); container.LoadConfiguration("repository"); // Le decimos a Unity que resuelva la implementación MyService service = new MyService(container.Resolve<IRepository>()); // Llamamos a un método del servicio Console.WriteLine(service.GetData()); Console.ReadKey(); } } }Ejecutamos y obtendremos «Get Data from SQLRepository» 🙂 Para utilizar la otra clase únicamente tendremos que cambiar en el fichero de configuración (en nuestro caso App.config), esta linea:
<register type="IRepository" mapTo="SQLRepository"/>por esta otra:
<register type="IRepository" mapTo="OracleRepository"/>Si os interesa profundizar en cómo usar Unity con archivos de configuración podéis echar un vistazo a este link: Using Design-Time Configuration
Happy codding 😉
Enlaces relacionados:
¿Qué es la Inyección de Dependencias?
How to: Inyección de dependencias con Ninject
Using Design-Time Configuration