Injection de dépendances dans Unity : injection de constructeur vs singleton ou passage d'arguments
Lors de l'utilisation de frameworks d'injection de dépendances tels que Unity, une considération cruciale se pose sur la façon de résoudre les dépendances au sein des couches plus profondes d'une application.
Dans le scénario présenté, le TestSuiteParser la classe nécessite l’accès aux instances TestSuite et TestCase. Pour résoudre ce problème, plusieurs approches sont explorées :
Conteneur Singleton Unity
La création d'un singleton pour stocker le conteneur Unity permet d'accéder au conteneur depuis n'importe où dans la base de code. Cependant, cette approche introduit une dépendance au conteneur lui-même, ce qui est loin d'être idéal.
Passer le conteneur Unity comme argument
Passer le conteneur Unity comme argument à chaque une classe qui nécessite des dépendances peut devenir encombrante et visuellement désagréable.
Constructeur Injection
La solution privilégiée pour l'injection de dépendances est l'injection de constructeur. Dans ce modèle, les dépendances sont déclarées comme paramètres dans le constructeur de classe, comme démontré dans la classe TestSuiteParser ci-dessous :
public class TestSuiteParser { private readonly TestSuite _testSuite; private readonly TestCase _testCase; public TestSuiteParser(TestSuite testSuite, TestCase testCase) { _testSuite = testSuite ?? throw new ArgumentNullException(nameof(testSuite)); _testCase = testCase ?? throw new ArgumentNullException(nameof(testCase)); } // ... }
En utilisant l'injection de constructeur, les dépendances sont automatiquement résolues par le conteneur lorsqu'une instance de la classe est créé. Cette approche garantit que la classe dispose des dépendances nécessaires disponibles lors de l'instanciation.
Dans la racine de la composition, le conteneur Unity peut être configuré comme suit :
container.RegisterType<TestSuite, ConcreteTestSuite>(); container.RegisterType<TestCase, ConcreteTestCase>(); container.RegisterType<TestSuiteParser>(); var parser = container.Resolve<TestSuiteParser>();
Lorsque le conteneur résout l'instance TestSuiteParser , il injecte automatiquement le TestSuite et le TestCase dépendances.
Conclusion
L'injection de constructeur fournit un moyen propre et efficace de résoudre les dépendances dans l'unité, éliminant les inconvénients des approches singleton ou de passage d'arguments. Cette approche favorise un couplage lâche et une testabilité améliorée dans votre application.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!