Resolviendo dependencias nombradas en Ninject

En artículos anteriores vimos cómo implementar la inyección de dependencias en un proyecto ASP.NET MVC usando el IoC Container Ninject, y también aprendimos cómo hacer inyección de propiedades. En este artículo aprenderemos cómo podemos hacer inyección de dependencias de múltiples clases concretas que implementan una misma interface usando nombramiento de dependencias con Ninject.

En este proyecto nos basaremos en el mismo ejemplo usado en anteriores post sobre inyección de propiedades con Ninject, 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
{
    [Inject]
    [Named("English")]
    public IMessages EnglishMessages { getset; }
 
    [Inject]
    [Named("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 [Inject] de Ninject 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á Ninject para determinar cómo resolver las dependencias. Para esto mismo, debemos configurar las dependencias a resolver para que Ninject pueda funcionar correctamente, y lo hacemos modificando el código del método RegisterServices que se encuentra en la clase NinjectWebCommon en la carpeta App_Start del proyecto ASP.NET MVC, así:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IMessages>().To<EnglishMessages>().Named("English");
    kernel.Bind<IMessages>().To<SpanishMessages>().Named("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: Ninject 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: