Abhängigkeitsinjektion in Unity: Konstruktorinjektion vs. Singleton oder Argumentübergabe
Bei der Verwendung von Abhängigkeitsinjektions-Frameworks wie Unity gibt es eine entscheidende Überlegung zum Auflösen von Abhängigkeiten in tieferen Schichten einer Anwendung.
Im vorgestellten Szenario die TestSuiteParser-Klasse erfordert Zugriff auf TestSuite- und TestCase-Instanzen. Um dieses Problem anzugehen, werden mehrere Ansätze untersucht:
Singleton Unity Container
Das Erstellen eines Singletons zum Speichern des Unity-Containers ermöglicht den Zugriff auf den Container von überall in der Codebasis. Dieser Ansatz führt jedoch zu einer Abhängigkeit vom Container selbst, was alles andere als ideal ist.
Übergabe des Unity-Containers als Argument
Übergabe des Unity-Containers als Argument an alle Klasse, die Abhängigkeiten erfordert, kann umständlich und optisch unangenehm werden.
Konstruktor Injektion
Die bevorzugte Lösung für die Abhängigkeitsinjektion ist die Konstruktorinjektion. In diesem Muster werden Abhängigkeiten als Parameter im Klassenkonstruktor deklariert, wie in der TestSuiteParser-Klasse unten gezeigt:
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)); } // ... }
Durch die Konstruktorinjektion werden Abhängigkeiten automatisch vom Container aufgelöst, wenn eine Instanz der Klasse vorhanden ist erstellt. Dieser Ansatz stellt sicher, dass die Klasse bei der Instanziierung über die erforderlichen Abhängigkeiten verfügt.
Im Kompositionsstamm kann der Unity-Container wie folgt konfiguriert werden:
container.RegisterType<TestSuite, ConcreteTestSuite>(); container.RegisterType<TestCase, ConcreteTestCase>(); container.RegisterType<TestSuiteParser>(); var parser = container.Resolve<TestSuiteParser>();
Wenn der Container die TestSuiteParser-Instanz auflöst , fügt es automatisch die TestSuite und den TestCase ein Abhängigkeiten.
Fazit
Konstruktorinjektion bietet eine saubere und effiziente Möglichkeit, Abhängigkeiten in Einheit aufzulösen und die Nachteile der Singleton- oder Argumentübergabeansätze zu beseitigen. Dieser Ansatz fördert eine lose Kopplung und eine verbesserte Testbarkeit in Ihrer Anwendung.
Das obige ist der detaillierte Inhalt vonKonstruktorinjektion vs. Singleton oder Argumentübergabe in Unity: Welcher Ansatz der Abhängigkeitsinjektion ist der beste?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!