Pagine

martedì 31 luglio 2012

IOC in ASP.NET MVC3 con Autofac

Per chi non sapesse cosa sia IOC (Inversion Of Control) secondo la definizione presa da Wikipedia, si intende un pattern di programmazione.
Vediamo come implementare questo pattern utilizzando AutoFac.

Iniziamo con la pagina del progetto : http://code.google.com/p/autofac/ e vediamo che il suo autore ha un blog personale, utile per reperire ulteriori informazioni al seguente indirizzo: http://nblumhardt.com/.

CropperCapture[28]Partivo da un progetto già esistente, quindi ho all’inizio importato le referenze Autofac utilizzando NuGet.

Installiamo Autofac e Autofac MVC3 Integration, come da immagine.

Una volta aggiunte le referenze al nostro progetto dobbiamo far registrare al nostro contenitore IOC le classi e le interfacce di servizio.

Visto che sono pigro, invece di registrare uno ad uno le interfacce e le classi, ho visto bene di utilizzare un metodo automatico e di utilizzare qualche convenzione.

Tutti i miei controller devono avere il nome che termina con “Controller”, mentre i repository devono terminare con “Repository”.

Quindi apriamo il file Global.asax.cs e, in Application_Start() chiamiamo la funzione che registrerà per noi i tipi e le classi.

 protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

RegisterContainersUsingAutofac();
}



RegisterContainerUsingAutoFac() sarà:

public void RegisterContainersUsingAutofac()
{
var builder = new ContainerBuilder();
builder.RegisterModelBinders(Assembly.GetExecutingAssembly());
builder.RegisterModelBinderProvider();

builder.RegisterControllers(Assembly.GetExecutingAssembly());

var dataAccess = Assembly.GetExecutingAssembly();

builder.RegisterAssemblyTypes(dataAccess)
.Where(t => t.Name.EndsWith("Repository"))
.AsImplementedInterfaces();

builder.RegisterModule(new AutofacWebTypesModule());

IContainer container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}



Come potete vedere dal codice, andiamo a prendere tutte le classi dell’assembly corrente (quindi se si vuole, si può registrare anche un assembly separato) e registriamo tutte le classi che terminano con “Repository”.


Infine, con l’istruzione builder.RegisterModule(new AutofacWebTypesModule());  registriamo delle classi di supporto proprie di MVC, infatti AutofacWebTypesModule è presente in AutoFac MVC3 Integration. Ad esempio se un nostro repository ha bisogno dell’HTTPContext, potremo scrivere:

public class ServiceContextRepository : IServiceContextRepository
{
private HttpContextBase _context;
public ServiceContextRepository( HttpContextBase context)
{

this._context = context;
}





Le classi rese disponibili sono:



  • HttpContextBase
  • HttpRequestBase
  • HttpResponseBase
  • HttpServerUtilityBase
  • HttpSessionStateBase
  • HttpApplicationStateBase
  • HttpBrowserCapabilitiesBase
  • HttpCachePolicyBase
  • VirtualPathProvider