Maison >développement back-end >C++ >Injection de constructeur vs singleton ou passage d'arguments dans Unity : quelle approche d'injection de dépendances est la meilleure ?

Injection de constructeur vs singleton ou passage d'arguments dans Unity : quelle approche d'injection de dépendances est la meilleure ?

Barbara Streisand
Barbara Streisandoriginal
2024-12-27 22:13:10632parcourir

Constructor Injection vs. Singleton or Argument Passing in Unity: Which Dependency Injection Approach is Best?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn