Constructor Injection - Spritzen wir auch Fabriken ein?

8

Nachdem ich mir die Clean Code Talks angehört hatte, wurde mir klar, dass wir Fabriken zum Erstellen von Objekten verwenden sollten. Wenn zum Beispiel ein House ein Door und ein Door ein DoorKnob hat, erstellen wir in HouseFactory ein neues DoorKnob und übergeben es an den Konstruktor von Door und dann Übergeben Sie das neue Objekt Door an den Konstruktor von House .

Aber was ist mit der Klasse, die House verwendet (sagen wir, der Klassenname ist ABC ) ? Es hängt von der HouseFactory ab, oder? Also übergeben wir das HouseFactory im Konstruktor von ABC ? Müssen wir nicht so viele Fabriken im Konstruktor durchgehen?

    
Can't Tell 24.01.2012, 00:09
quelle

3 Antworten

9

Bleiben Sie bei den Door- und DoorKnob-Beispielen, injizieren Sie keine Fabrik - Sie injizieren den DooKnob selbst:

%Vor%

In dieser Ebene sind keine Fabriken in Sicht.

House hingegen hängt von Door ab, aber nicht von DoorKnob:

%Vor%

Dadurch bleiben die Optionen offen, bis Sie haben , um alles in der Anwendung zu verfassen Zusammensetzung Wurzel :

%Vor%

Sie können einen DI-Container verwenden, um auf dieser Ebene zu komponieren, müssen dies aber nicht. Keine Fabriken sind beteiligt.

    
Mark Seemann 24.01.2012, 07:29
quelle
1

Wenn Sie zu viele Fabriken injizieren, ist das ein Code-Geruch namens Konstruktor, der injiziert zeigt an, dass deine Klasse zu viel macht.

Viele Container bieten eine Funktion namens Auto-Factories. Das heißt, sie erzeugen automatisch Fabriken vom Typ Func<T> , wenn sie wissen, wie sie T generieren können.

Castle Windsor hat eine erweiterte Funktion namens Type Factory facilities generiert Implementierungen einer Factory-Schnittstelle on-the-fly.

Im TecX-Projekt gibt es auch einen Port für typisierte Fabriken für Unity.

    
Sebastian Weber 24.01.2012 07:08
quelle
0

Wenn Sie Unity verwenden, habe ich kürzlich ein Äquivalent von Castle Windsor Type Factories für Unity implementiert. Sie finden das Projekt unter Ссылка und das NuGet-Paket unter Ссылка .

Die Verwendung ist die folgende:

%Vor%

Sie müssen nur die IFooFactory-Schnittstelle mit einer Methode erstellen, die IFoo zurückgibt, und der Rest wird für Sie von der Bibliothek erledigt. Sie können IFooFactory auflösen und damit sofort IFoo-Objekte erstellen.

    
Pedro Pombeiro 06.12.2012 21:40
quelle