Je comprends que l'un des moyens (peut-être les meilleurs) d'utiliser l'inversion de contrôle consiste à injecter les objets dépendants dans le constructeur (injection du constructeur).Dois-je utiliser des objets passés au constructeur pendant l'injection?
Cependant, si je fais des appels à ces objets en dehors de de l'objet qui les utilise, j'ai l'impression de violer une sorte de règle - est-ce le cas? Je ne pense pas qu'il existe un moyen d'empêcher cela, mais devrais-je établir une règle qui (en dehors des objets moqués) nous ne devrions jamais appeler des méthodes de ces objets?
[EDIT] Voici un exemple simplifié de ce que je fais. J'ai un objet FileController
qui est essentiellement utilisé pour le catalogage des fichiers. Il utilise un objet FileDal
qui parle à la base de données pour insérer/interroger/mettre à jour les tables File
et Directory
.
Sur mon implémentation réelle, je construis le contrôleur en demandant à Castle d'utiliser une version SQL Server de la couche DAL. Dans mon test unitaire, j'utilise une version Sqlite en mémoire de la couche DAL. Cependant, en raison de la façon dont la couche DAL est implémentée, j'ai besoin d'appeler BeginTransaction et Commit autour de l'utilisation du FileController
pour que la connexion ne soit pas fermée et que je puisse ensuite faire des récupérations et des assertions. Pourquoi je dois faire cela n'est pas très important, mais cela m'a amené à penser que l'appel de méthodes sur un objet DAL qui est utilisé par d'autres clients (contrôleurs) ne sonnait pas kasher. Voici un exemple:
FileDal fileDal = CastleFactory.CreateFileDal();
fileDal.BeginTransaction();
FileController fileController = new FileController(fileDal);
fileController.CallInterestingMethodThatUsesFileDal();
fileDal.Commit();
Je suis très intéressé de voir un exemple simplifié de ce que vous faites réellement. Cela peut nous donner un peu plus de perspicacité dans votre situation particulière. – Steven