Utiliser Unity 2 avec asp.net mvc 3 comme inverseur de dépendance

La version RC d’ASP.Net MVC 3 vient de sortir aujourd’hui comme l’annonce sur son blog Scott Guthrie http://weblogs.asp.net/scottgu/archive/2010/11/09/announcing-the-asp-net-mvc-3-release-candidate.aspx

Cette nouvelle mise à jour de MVC3 introduit un nouveau système d’inversion de dépendance basé sur le nouveau type System.Web.Mvc.DependencyResolver.

Je vais expliquer ici comment continuer à utiliser Unity comme DI et il y a un certain nombre de changement par rapport à MVC2.

Il n’y a plus l’obligation de passer par la méthode Start de global.asax, en effet MVC3 introduit un nouvel attribut “PreApplicationStartMethod” de niveau Assembly, avec celui ci il suffit d’indiquer le type dans lequel se trouve la méthode à exécuter avant de lancer l’application web, exemple :

[assembly: PreApplicationStartMethod(typeof(Mvc3Application4.UnityStarter), "Start")]


 



public static class UnityStarter
{
public static void Start()
{
var container
= new Microsoft.Practices.Unity.UnityContainer();
container.RegisterInstance
<IControllerFactory>(System.Web.Mvc.ControllerBuilder.Current.GetControllerFactory());
container.RegisterType
<IControllerActivator, UnityControllerActivator>();
container.RegisterType
<IViewPageActivator, UnityViewPageActivator>();
var resolver
= new UnityDependencyResolver(container);
System.Web.Mvc.DependencyResolver.SetResolver(resolver);
}
}


Il n’y a plus besoin de créer sa propre fabrique de controllers il suffit d’indiquer au container d’utiliser celle par défaut pour la création des controllers



une nouvelle interface fait son apparition, IControllerActivator, c’est ici que l’injection de dépendance pour les controllers va s’opérer, pour intercepter l’injection via unity nous allons créer notre propre ConrollerActivator de la manières suivante :



public class UnityControllerActivator : IControllerActivator
{
public IController Create(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
return DependencyResolver.Current.GetService(controllerType) as IController;
}
}


une nouvelle interface fait également son apparition, sa responsabilité est la gestion de la création des vues IViewPageActivator, nous allons aussi intercepter la création de celles-ci pour injecter les dépendances nécessaires avec la classe suivante :



public class UnityViewPageActivator : IViewPageActivator
{
public object Create(ControllerContext controllerContext, Type type)
{
return DependencyResolver.Current.GetService(type);
}
}


pour finir nous allons indiquer au moteur asp.net qui s’occupe de la résolution des dépendance de manière concrète avec le code suivant :



public class UnityDependencyResolver : System.Web.Mvc.IDependencyResolver
{
public UnityDependencyResolver(Microsoft.Practices.Unity.IUnityContainer container)
{
this.Container = container;
}

public Microsoft.Practices.Unity.IUnityContainer Container { get; private set; }

public object GetService(Type serviceType)
{
return Container.Resolve(serviceType);
}

public IEnumerable<object> GetServices(Type serviceType)
{
return Container.ResolveAll(serviceType);
}
}


il ne reste plus qu’a déclarer au système que l’instance du resolver via la ligne de code suivante System.Web.Mvc.DependencyResolver.SetResolver(resolver);



Je trouve cette nouvelle architecture beaucoup plus simple qu’avec MVC2 ou il fallait pas mal bricoler pour arriver au même résultat, j’avais déjà fait un article sur la configuration de unity 2 avec MVC2 asp.net mvc 2 unity 2



Bon maintenant je m’attaque à la migration d’ERPStore de MVC2 vers MVC3

Aucun commentaire: