2009-06-05 10 views
5

Dois-je faire quelque chose dans ce sens? Je pense à tous mes contrôleurs héritant de BaseController. Est-ce que cela brise le modèle de conception de l'IoC? Que devrais-je faire d'autre?Contrôleurs IoC et ASP.NET MVC

public class BaseController: Controller 
{ 
    protected ICookieService CookieService { 
     get { 
      return ServiceResolver.Resolve<ICookieService>(new { HttpContext = HttpContext }); 
     } 
    } 
    protected IDateTimeService DateTimeService { 
     get { 
      return ServiceResolver.Resolve<IDateTimeService>(); 
     } 
    } 
    protected ISettingsService SettingsService { 
     get { 
      return ServiceResolver.Resolve<ISettingsService>(); 
     } 
    } 

} 

Répondre

10

Il serait beaucoup plus simple d'aller avec l'injection de constructeur et un ControllerFactory injectent pour vous. Si vous le pouvez, n'utilisez pas un localisateur de service (votre ServiceResolver) si vous pouvez vous en sortir avec l'injection du constructeur.

Il y a quelques informations à ce sujet sur Adding a controller factory to ASP MVC

Le lien montre comment le faire avec StructureMap et il semble que vous utilisez l'unité, mais il devrait être facile à adapter.

+1

Je suis d'accord. Vous ne devez utiliser votre résolveur de type qu'à la racine de votre application. Si pour aucune autre raison que si vous avez besoin de changer les injecteurs, vous n'avez pas besoin de changer tout votre code, seulement le point où votre premier objet. Dans mon application, le seul endroit qui connait l'injecteur est Global.asax, et même là je l'utilise dans un trop grand nombre d'endroits (c'est-à-dire que je l'utilise en 2 endroits). – Talljoe

+0

Je suis en train d'utiliser Castle Windsor mais avec un ensemble d'interfaces wrapper pour cacher sa complexité/dépendance –

+0

Merci pour votre aide! –

0

Je suppose que les interfaces protégées dont vous disposez sont des dépendances pour le contrôleur. Il est possible de configurer un conteneur IoC pour injecter les dépendances pour vous. Cela peut certainement être fait avec Castle Windsor. Vous devrez changer votre classe BaseController pour avoir un constructeur avec les dépendances requises, aussi longtemps que le conteneur IoC connaîtra les autres services, il pourra les injecter.

0

L'un des principes sous-jacents Inversion of Control et Component-Driven Development est sur le point en utilisant localisateurs de service statique que lorsqu'il n'y a pas d'autre moyen (i.e. .: dans les hôtes de services Web ou sources de données d'objet). Techniquement, en utilisant des localisateurs de service statiques, le contrôleur de base ne viole pas l'IoC, il ne l'utilise tout simplement pas.

Vérifiez existing integration entre le conteneur Autofac IoC et ASP.NET MVC (d'autres conteneurs devraient pouvoir faire cela aussi).

Questions connexes