2009-07-24 6 views
5

J'ai un BaseController que j'utilise pour gérer mes problèmes transversaux pour un projet MVC.asp.net mvc avec ioc -> évitant la soupe constructor avec BaseController

Cependant, cela signifie que mon contrôleur dispose de 3 dépendances:

public BaseController (IUserService u, ITenantDetailsService t, ISiteConfiguration c) 

L'effet secondaire est que mes constructeurs pour chaque contrôleur dérivé croulent sous les paramètres:

public AccountController(ILocationService locationService, IAccountService accountService, IFormsAuthentication formsAuth, IMembershipService service, IUserService userService, ISiteConfiguration configuration) 
     : base(locationService,userService, configuration) 

Je suis En utilisant IoC (Windsor) pour résoudre mes contrôleurs, sachez que je pourrais supprimer les dépendances du constructeur et le laisser auto-câbler les propriétés publiques.

Y a-t-il une raison pour ne pas le faire autre que masquer certaines des dépendances?

public AccountController (IAccountService, IFormsAuthentication, IMembershipService) 

Cette approche semble plus lisible et donne un aperçu clair des dépendances pertinentes à ce contrôleur spécifique. Ou ai-je tout faux et un BaseController n'est pas l'endroit approprié pour stocker les services de coupe transversale.

Pensées appréciées.

Merci, Chris

Répondre

1

Une raison pour laquelle je peux penser est convention - beaucoup de gens interprètent comme injection setter dépendance non nécessaire et l'injection de constructeur, au besoin. Altough - c'est juste une convention, et ne m'empêcherait pas d'utiliser des propriétés auto-câblées dans cet exemple.

L'injection de dépendances est supposée simplifier votre travail (je reconnais que ce n'est pas la raison la plus importante d'utiliser DI, mais je pense que c'est une raison valable), ne le rend pas plus difficile. Considérez une situation où vous devez ajouter un autre service "global". Vous devrez passer en revue chaque contrôleur dans votre projet et modifier un constructeur, ce qui est vraiment, vraiment mauvais.

Je suis venu avec une autre idée pour résoudre ce problème: créer un objet collecteur, qui stocke toutes les dépendances «globales», le passer aux contrôleurs concrets, puis passer à la base, qui obtiendrait les dépendances requises. Cela résoudrait le problème de l'ajout de dépendances et vous indiqueriez clairement que le contrôleur concret transmet les dépendances à la classe de base. Je n'ai pas aimé cependant, car il faut encore 2 classes pour changer ("dependency collector" et BaseController) quand j'ajoute une nouvelle dépendance "globale".

+0

J'aime beaucoup votre approche car avoir une seule dépendance montre clairement que la magie ne se produit pas. – Chris