Dependency Injection für Objekte, die Parameter benötigen

8

Alle unsere Berichte werden aus Objektdiagrammen erstellt, die aus unseren Domänenobjekten übersetzt werden. Um dies zu ermöglichen, haben wir eine Translator-Klasse für jeden Bericht und haben Dependency Injection zur Übergabe von Abhängigkeiten verwendet.

Das hat super funktioniert und würde schöne Klassen ergeben, die wie folgt strukturiert sind:

%Vor%

In einigen Fällen hat das Mapping jedoch viele verschiedene Gruppierungsoptionen. Als Ergebnis würde der C-Tor zu einer Mischung von Klassenabhängigkeiten und Parametern werden.

%Vor%

Jetzt können wir es noch testen, aber es funktioniert nicht mehr wirklich mit einem IoC-Container, zumindest in einer sauberen Art und Weise. Außerdem können wir CreateCheck nicht mehr zweimal aufrufen, wenn die Einstellungen für jede Prüfung unterschiedlich sind.

Obwohl ich erkenne, dass es ein Problem ist, sehe ich nicht unbedingt die richtige Lösung. Es scheint irgendwie komisch, für jede Klasse eine Fabrik zu schaffen ... oder ist das der beste Weg?

    
Andrew 03.04.2010, 23:36
quelle

1 Antwort

13

Hier im Dunkeln geschossen, aber könnten Sie diese Parameter stattdessen in die Methode verschieben?

Mit anderen Worten:

%Vor%

Müssen diese Parameter über den Konstruktor übergeben werden?

(Hinweis: Wenn Ihre Antwort darauf lautet "es gibt zu viele Methoden, um dies zu praktizieren", dann könnte ein Teil des Problems darin bestehen, dass die Abstraktion zu grob ist).

Eine andere Option (es ist wirklich schwer zu sagen, ohne das Domänenmodell und die Injektionsmuster zu verstehen) wäre, ein Parameterobjekt einzuführen, das selbst vom Injektor verwaltet wird:

%Vor%

Dann injiziere dies mit dem Konstruktor:

%Vor%

Dies sollte genug sein. Sie können dann eine konkrete CheckConfiguration -Klasse erstellen, die diese beiden bool -Eigenschaften in ihrem Konstruktor verwendet, und Ihren Container so konfigurieren, dass er basierend auf einem übergeordneten DI-Parameter verschiedene Instanzen des Parameterobjekts (interface) erstellt.

Das letzte, was ich erwähnen sollte, ist, dass, nur weil Sie DI benutzen, nicht bedeutet, dass alles vom Container verwaltet werden muss. Es ist nicht so schlecht, CheckTranslator -Objekte ad hoc zu erstellen, wenn es nur eine Art von "Übersetzer" gibt. Solange der Übersetzer immer noch auf Abstraktionen angewiesen ist, was er hier tut, sollten Sie ihn vielleicht gar nicht injizieren, sondern einfach nur übergeordnete DI-fähige Klassen ad-hoc erstellen lassen.

    
Aaronaught 04.04.2010, 00:20
quelle

Tags und Links