[ASP.NET MVC] Inyectando dependencias con Microsoft Unity

A post from Blog Julitogtu

Descarga el código

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(); }

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!

bleak theme by Jack Preston