Resolviendo dependencias nombradas en Unity

En artículos anteriores hemos visto como implementar la inyección de dependencias mediante el contenedor Unity en un proyecto ASP.NET MVC, usando inyección por constructores o inyección de propiedades en clases. En este artículo quiero mostrarles como se puede resolver con Unity un caso que es muy común en un proyecto de desarrollo de software que use inyección de dependencias: ¿cómo resolver la inyección de múltiples clases concretas que implementan una misma interface?

En este proyecto nos basaremos en el mismo ejemplo usado en mi anterior post sobre inyección de propiedades con Unity, haciendo algunas modificaciones al código.

Lo primero que tenemos, es una interface con el siguiente código:

public interface IMessages
{
    string Greeting();
}

Luego, crearemos dos sencillas clases que implementen la misma interface:

public class EnglishMessages : IMessages
{
    public string Greeting()
    {
        return "Hello!";
    }
}
public class SpanishMessages : IMessages
{
    public string Greeting()
    {
        return "Hola!";
    }
}

Ahora, crearemos un controlador MVC como vemos a continuación:

public class MessagesController : Controller
{
    [Dependency("English")]
    public IMessages EnglishMessages { getset; }
 
    [Dependency("Spanish")]
    public IMessages SpanishMessages { getset; }
 
    // GET: Messages
    public ActionResult Index()
    {
        ViewBag.EnglishMessage = EnglishMessages.Greeting();
        ViewBag.SpanishMessage = SpanishMessages.Greeting();
        return View();
    }
}

En este ejemplo vemos dos cosas: el uso del atributo [Dependency] de Unity para indicar que las propiedades EnglishMessages y SpanishMessages son inyectables, y adicional a eso, un parámetro con un nombre. Ese nombre será el que utilizará Unity para determinar cómo resolver las dependencias. Para esto mismo, debemos configurar las dependencias a resolver para que Unity pueda funcionar correctamente, y lo hacemos modificando el código del método RegisterTypes que se encuentra en la clase UnityConfig en la carpeta App_Start del proyecto ASP.NET MVC, así:

public static void RegisterTypes(IUnityContainer container)
{
    // El nombre de la dependencia indica a Unity que use este tipo
    // para inyectarlo donde sea requerido.
    container.RegisterType<IMessagesEnglishMessages>("English");
    container.RegisterType<IMessagesSpanishMessages>("Spanish");
}

Por último, está el código de la vista que usamos para ver el funcionamiento del método en el controlador que adicionamos:

@{
    ViewBag.Title = "Index";
}
<br />
 
English message: @ViewBag.EnglishMessage<br />
Spanish message: @ViewBag.SpanishMessage

El último paso es ejecutar la aplicación ASP.NET MVC en el navegador y ver el resultado: Unity ha resuelto cada dependencia de acuerdo al nombre dado y de esa forma puede saber qué tipos resolver cuando existen varias clases concretas que implementan una misma interface.

unityprop_02

El código fuente usado en el artículo puede ser descargado desde mi página de GitHub.

ironcat

 

Anuncios

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: