2

Je suis nouveau à Castle Windsor et j'utilise la dernière version. J'ai créé des entrées pour mes dépôts qui fonctionnent bien mais j'ai une dépendance finale que je transmets à mon contrôleur.IOC sur IValidationDictionary avec Castle Windsor

J'ai créé un ModelStateWrapper qui hérite de IValidationDictionary. Le ModelStateWrapper prend ModelStateDictionary dans son constructeur de sorte que dans mon code je peux passer ce qui suit comme un exemple:

IMembershipService _memSvc; 
IValidationDictionary _validationService; 

public AccountController() 
{ 
    _validationService = new ModelStateWrapper(this.ModelState); 
    _memSvc = new MembershipService(_validationService); 
} 

Dans mes tests, je peux alors le faire en utilisant Moq:

var v = new Mock<ModelStateDictionary>(); 
_validationService = new ModelStateWrapper(v.Object); 
_service = new MembershipService(_validationService); 

je peux » Il semble que Castle puisse injecter ModelState avec ModelStateWrapper. Je n'ai aucune idée par où commencer et il semble que je ne peux pas simplement «l'ignorer» et essayer d'injecter manuellement pendant que Castle est à la recherche de dépendances et me lancer une erreur disant qu'il reste une dépendance. Comment puis-je configurer Castle Windsor pour utiliser le ModelStateWrapper basé sur IValidationDictionary et également inclure ModelState comme paramètre de constructeur?

Lloyd

Répondre

1

Il semble que vous avez une dépendance circulaire (jamais une bonne chose). Vous pouvez contourner le problème en utilisant un Abstract Factory as described in this very similar question.

Toutefois, bien que vous puissiez résoudre le problème de cette manière, il serait préférable de revoir la conception de l'API pour supprimer la dépendance circulaire. Les dépendances circulaires indiquent souvent un défaut de conception.

+0

Alors serait mon regard du contrôleur de compte comme : IMembershipService _memSvc; IValidationDictionary _validationService; Public account controller (IValidationDictionaryFactory validationDFactory) } Si oui, comment l'exécuterais-je dans un test avec un modelstate mocké? Désolé, si ce sont des questions stupides, j'ai seulement un jour sur Dependency Injection. – lloydphillips

+1

L'approche la plus simple pour DI consiste à utiliser l'option Constructor Injection chaque fois que vous le pouvez, donc injectez toutes les dépendances via le constructeur. Cela vous permettra également de les remplacer par des tests doubles si nécessaire. Abstract Factory est une solution lorsque vous n'avez pas la dépendance au moment du branchement. Il peut y avoir plusieurs raisons à cela. –

0

Vous vous trompez, et vos mauvaises actions n'ont rien à voir avec le conteneur que vous utilisez.

suffit de le faire comme ça, si vous devez absolument:

public AccountController(IValidationService service) 
{ 
    _validationService = service; 
    _memSvc = new MembershipService(_validationService); 
} 

alors que vous vous inscrivez votre composant, utilisez une méthode OnCreate:

container.Register(
    Component.For<AccountController>() 
    .WheveverEleseYouNeedHere() 
    .OnCreate((k, controller) => 
     controller.ValidationService.Init(controller.ModelState))); 
+0

Si j'ai environ 8 contrôleurs, est-ce que je vais devoir enregistrer chaque contrôleur comme ceci pour injecter le modelstate? – lloydphillips

+0

Ok, je pense que je me fais confus ici. Si j'ai enregistré mes Interfaces dans web.config puis-je utiliser ce code dans WindsorControllerFactory? Désolé, je ne pense pas que je comprends très bien. :) – lloydphillips

Questions connexes