La Inversión de Dependencia o Inversión de Control son conceptualmente lo mismo, aunque el primero sea el último de los principios SOLID y el segundo sea un patrón de diseño. Ambos ayudan a realizar una arquitectura en donde los objetos estén desacoplados.
Autofac es un framework que nos ayuda a implementar estos dos conceptos implementando internamente el patrón Abstract Factory. Soporta .Net framework 4.5, Silverlight 5, aplicaciones para Windows Store y aplicaciones para Windows Phone 8.
Basta sólo con registrar Tipos e Interfaces para que Autofac instancie la clase concreta correspondiente para ser inyectada en otra.
Para comprender mejor su funcionamiento, nada mejor que un ejemplo:
Como ejemplo, tendremos en cuenta un controller de MVC, como una simple implementación de los conceptos de inversión de dependencia o inversión de control, al cual se le inyecta, a través de su constructor, un repositorio de datos.
Crearemos un proyecto MVC 4 y agregaremos la referencia a Autofac a través de NuGet. Para ello, seleccionaremos la opción Manage NuGet Packages... y filtraremos los paquetes disponibles en búsqueda de Autofac.
Como se puede apreciar en la imagen, Autofac está disponible para proyectos como MVC 3, MVC 4, Web Api, WCF, WWebForms, MEF y otros tantos. En nuestro caso, seleccionaremos Autofac ASP.NET MVC4 Integration y presionaremos el botón Install. De manera automática se agregará este framework y todas las dependencias necesarias.
De igual manera para todo tipo de proyecto, se debe realizar la registración antes de que se realice la primera instanciación.
Para nuestro ejemplo, crearemos una clase: AutofacConfig y la implementación del método Register. para registar los tipos necesarios. Dicha clase, por cuestiones de buenas prácticas, la crearemos dentro de la carpeta App_Start.
using Autofac;
using Autofac.Integration.Mvc;
using MvcAutofac.Models;
using System.Reflection;
using System.Web.Mvc;
namespace MvcAutofac.App_Start
{
public class AutofacConfig
{
public static void Register()
{
//Creación del contenedor de Autofac
var builder = new ContainerBuilder();
//Registración de todos los controllers presentes en el assembly.
//(También podrían registrarse uno por uno)
builder.RegisterControllers( Assembly.GetExecutingAssembly() );
//Registramos el repositorio y la interfaz a la cual "responde".
builder.RegisterType().As();
//Configuramos a quien va a resolver las dependencias.
DependencyResolver.SetResolver( new AutofacDependencyResolver( builder.Build() ) );
}
}
}
A continuación, realizaremos el registro en el primer lugar que se ejecuta: Global.asax.cs. Para ello, agregaremos la invocación al método Register de la clase, AutofacConfig, que creamos.
using MvcAutofac.App_Start;
using System.Web.Http;
using System.Web.Mvc;
using System.Web.Optimization;
using System.Web.Routing;
namespace MvcAutofac
{
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
//Invocamos al método Register de nuestra clas AutofacConfig.
AutofacConfig.Register();
WebApiConfig.Register( GlobalConfiguration.Configuration );
FilterConfig.RegisterGlobalFilters( GlobalFilters.Filters );
RouteConfig.RegisterRoutes( RouteTable.Routes );
BundleConfig.RegisterBundles( BundleTable.Bundles );
AuthConfig.RegisterAuth();
}
}
}
Simplemente con éstas líneas que escribimos, Autofac se encargará de instanciar las clases necesarias cuando sean requeridas y no deberemos preocuparnos por implementar un Abstract Factory o Factory Method propio.
Para que resulte más práctico, dejo a disposición la descarga de este ejemplo. El mismo fue creado con Visual Studio 2012 y .Net Framework 4.0.
2 comentarios:
Buenisima la nota, me ganaste de mano!!! jajaja ( Re-editada para que se sepa quien soy )
Publicar un comentario
Muchas gracias por leer el post y comentarlo.