Ich habe Daniel Cazzulino's Serien über building a DI container using TDD verfolgt. In part five of the series fügt er Unterstützung für Containerhierarchien hinzu, ohne zu kommentieren, was diese Funktion nützlich macht. Ich habe in vielen der DI-Frameworks erwähnt, dass Hierarchien unterstützt werden, aber ich habe Probleme zu verstehen, wann sie verwendet werden und warum. Kann jemand Einblick geben?Warum unterstützen Dependency Injection-Frameworks Container-Hierarchien?
Antwort
Here's a sample, die untergeordnete Container in einem Szenario verwendet, das dem ähnelt, das Matt beschreibt. Es verwendet untergeordnete Container, um zwischen verschiedenen Datenbankkonfigurationen auszuwählen.
Der Schlüssel hier ist, dass die meisten der Konfiguration zwischen den untergeordneten Container geteilt wird (die Teil gehört in den übergeordneten Container gemeinsam)
Ich habe einen Kommentar auf Kzu Blog mit der gleichen Frage hinterlassen. Es ist eine Schande, dass er den Anwendungsfall für eine solche Funktion vor der Codierung nicht geklärt hat.
Das einzige, was mir einfällt, ist, wenn Sie verschiedene Arten von Ihrem Container in verschiedenen Teilen Ihrer App gelöst haben möchten. Wenn Sie beispielsweise ein Auftragserfassungssystem mit zwei separaten Abschnitten haben und jeder Abschnitt identisch ist, mit der Ausnahme, dass eine andere Produktliste angezeigt werden muss, können Sie für jeden Abschnitt einen untergeordneten Container erstellen und die Registrierung Ihres Bereichs überschreiben Produkt-Repository in jedem. Wann immer ein Abschnitt versuchte, ein Produktrepository aufzulösen (oder irgendetwas, das davon abhängig war), würde es die Instanz erhalten, die Sie im Kindcontainer und nicht im Elterncontainer eingerichtet hatten. So ähnlich wie beim Überschreiben einer virtuellen Methode.
Dies könnte weit weg von der Basis sein, aber es ist das Beste, was ich mir vorstellen konnte.
Es gibt gute Gründe für Container Kind, wenn Dependency Injection vollständig durch das Projekt angenommen wird . Stellen wir uns eine Anwendung vor, die Nachrichten von zwei verschiedenen, aber ähnlichen Systemen verarbeitet. Der Großteil der Verarbeitung ist ähnlich, aber es gibt Variationen, um Kompatibilität von diesen Systemen zu unterstützen. Unser Ziel ist es, den Code wiederzuverwenden, den wir können, während wir anderen Code schreiben, wenn sich die Anforderungen unterscheiden.
Bei der OO-Programmierung verbinden wir eine Reihe von Klassen, die zusammenarbeiten, um die Systemanforderungen zu erfüllen. Der DI-Container übernimmt diese Verantwortung. Wenn eine Nachricht von einem System ankommt, möchten wir eine Gruppe kollaborierender Klassen erstellen, die für die Verarbeitung einer Nachricht von diesem bestimmten System geeignet sind.
Wir haben einen Top-Level-Container, der Artikel hat, die zwischen den beiden Systemen nicht variieren. Dann haben wir Kinderbehälter, die tun zwischen Systemen variieren. Wenn eine Nachricht eintrifft, fragen wir den entsprechenden untergeordneten DI-Container nach einer messageProcessor
. Basierend auf der Konfiguration dieses Containers (der bei Bedarf auf den übergeordneten Container zurückfällt) kann das DI-Framework einen messageProcessor (ein Objekt, das von entsprechenden Mitarbeitern unterstützt wird) für das fragliche System zurückgeben.
Bitte hinterlassen Sie einen Kommentar, wenn dies keine klare Antwort ist. Sie können auch nach "Roboterbeine Problem" suchen. Jedes Bein ist identisch, aber man braucht einen linken Fuß und das andere braucht einen rechten Fuß. Wir könnten einen Kinder-DI-Behälter für jedes Bein haben.
Das beste Beispiel, das mir für verschachtelte Container bekannt ist, ist ein Windowing-System. Es ist sehr schön für die Trennung von Bedenken, dass jedes Register/Fenster seinen eigenen Container unabhängig von den anderen Registerkarten/Fenstern hat, wobei alle Fenstercontainer globale Abhängigkeiten von einem übergeordneten Container erben.
Dies ist insbesondere erforderlich, wenn Sie doppelte Registerkarten/Fenster haben können, da Sie Instanzen verschiedener Klassen für jedes Duplikat-Register/Fenster in verschiedenen Fällen unterscheiden möchten.
- 1. Warum unterstützen Arrays IList?
- 2. Warum unterstützen keine Nummern .dup?
- 3. Warum möchten Sie Dependency Injection ohne Konfiguration?
- 4. Warum CDI Bohnen unterstützen keine endgültige Methoden
- 5. Warum soll C++ parametrischen Polymorphismus nicht unterstützen?
- 6. Warum unterstützen nicht faule Sprachen Mutation?
- 7. Warum unterstützen Java Generics keine primitiven Typen?
- 8. Warum Actor-Modul keine gleichzeitige Mailbox unterstützen?
- 9. Den Dependency Injector durch Dependency Injection injizieren
- 10. Dependency-Injection
- 11. Dependency Injection
- 12. Dependency Injection Sonderfall
- 13. Dependency Injection & Singleton Entwurfsmuster
- 14. Dependency Injection mit benutzerdefinierten Mitgliedschaftsanbieter
- 15. Warum kann ich [assembly: Dependency()] nicht über eine Klasse setzen?
- 16. Dependency Injection Container - Fabrik Muster
- 17. Warum unterstützen keine Browser außer Firefox animierte PNGs?
- 18. Warum unterstützen Google Collections MultiKeyMap nicht wie Apache Collections?
- 19. Warum html embeded pdf kann chinese-character Dateiname nicht unterstützen?
- 20. Warum unterstützen automatische C# -Eigenschaften keine Standardwerte wie VB 2010?
- 21. Warum partielle Methoden ref unterstützen, aber nicht out Parameter
- 22. WeChat von Android kann GetUserMedia mit https nicht unterstützen. Warum?
- 23. Funktionaler Grund, warum gespeicherte Prozeduren INSERT/EXECUTE INTO nicht unterstützen?
- 24. Benötigte Java-Version von Maven Dependency?
- 25. Lesen Dependency Walker-Ausgabe
- 26. Lazy Dependency Injection
- 27. Laravel Dependency Injection/IOC
- 28. ASP.NET MVC - Dependency Injection
- 29. AngularJS: Dependency Management
- 30. Dependency Injection und ModelStateWrapper