[ASP.NET MVC] Inyectando dependencias con Microsoft Unity

Posted on Actualizado enn


Hola a todos, en el anterior post (míralo acá) vimos como podemos crear una factoría de controladores personalizada para poder instanciar controladores que tienen un constructor que recibe parámetros, hoy vamos a ver algo muy parecido, solo que en este caso vamos a utilizar un DI Container (contenedor de inyección de dependencias).

El ejemplo, básicamente consiste en que vamos a inyectar un objecto que nos va a permitir escribir en un log, entonces en el controlador tenemos:

public class HomeController : Controller
{
	private ILog log;
	
	public HomeController(ILog log)
	{
		this.log = log;
	}
	
	public ActionResult Index()
	{
		log.Log("Escribiendo en el log");
		return View();
	}
}

Revisando el anterior código, vemos que HomeController requiere un objeto de tipo ILog, es decir que vamos a poder inyectar cualquier clase que implemente dicha interfaz, recuerden que uno de los principios de la inyección de dependencias es trabajar contra abstracciones y no implementaciones.

Ahora vamos con la interfaz ILog:

public interface ILog
{
	void Log(string str);
}

Y ahora una clase que implementa dicha interfaz (la lógica para el ejemplo no es importante):

public class LogFile : ILog
{
	public void Log(string str)
	{
		Debug.Write(str);
	}
}

Ahora viene lo interesante, como DI Container vamos a utilizar Microsoft Unity, así que añadimos por Nuget el paquete Unity.MVC4:

Unity

La ventaja de añadir dicho paquete es que en la raíz del sitio nos añade la clase Bootstrapper donde vamos a poder registrar los componentes:

public static class Bootstrapper
{
	public static IUnityContainer Initialise()
	{
	  var container = BuildUnityContainer();
	  DependencyResolver.SetResolver(new UnityDependencyResolver(container));

	  return container;
	}

	private static IUnityContainer BuildUnityContainer()
	{
	  var container = new UnityContainer();
	  RegisterTypes(container);

	  return container;
	}

	public static void RegisterTypes(IUnityContainer container) {}
}

Ahora es tiempo de registrar nuestras dependencias, para ello hacemos uso del método RegisterTypes de la clase Bootstrapper, para ello usamos container.RegisterType:

public static void RegisterTypes(IUnityContainer container)
{
	container.RegisterType<ILog, LogFile>();
}

Finalmente solo resta realizar el llamado a nuestro DI Container, en este caso usamos el evento Application_Start del Global.asax:

protected void Application_Start()
{
	AreaRegistration.RegisterAllAreas();
	FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
	RouteConfig.RegisterRoutes(RouteTable.Routes);
	BundleConfig.RegisterBundles(BundleTable.Bundles);

	Bootstrapper.Initialise();
}

Y eso es todo, la dependecia es inyectada gracias al uso del DI Container!

3 comentarios sobre “[ASP.NET MVC] Inyectando dependencias con Microsoft Unity

    Mario escribió:
    01/11/2014 en 22:23

    Buen artículo, pero realizar semejante arte de magia se empaña un poco por tener que realizar una asignación de Interfaz – Implementación “container.RegisterType();” hardcoded.

    Creo que hay algo de eso aquí http://msdn.microsoft.com/en-us/library/dn178466%28v=pandp.30%29.aspx

    Saludos

    Julio Avellaneda respondido:
    01/12/2014 en 05:36

    Gracias Mario, bueno, el tema con Unity es bastante amplio, tu puedes realizar implementaciones más avanzadas, pero algo a tener siempre presente es validar que tanta complejidad debes aplicar a tu proyecto, o el uso de un patrón en lugar de ayudarte con un problema puede que te de uno más grande, el link está muy bueno!

    Saludos!

    […] Si ahora revisamos HomeController, por ningún lado aparece la clase LogFile, y HomeController solo conoce la interfaz ILog, es decir solo tiene conocimiento de lo que hace más no de cómo lo hace, y otro punto importante, en el constructor de la clase le inyectamos la dependencia. Si en este punto probamos la aplicación vamos a obtener un error, y por el momento les dejo dos posibles soluciones Creando una factoría de controladores personalizada e Inyectando dependencias con Microsoft Unity. […]

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