2009-02-03 9 views
6

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

1

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)

1

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.

0

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.

0

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.

Verwandte Themen