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?
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.
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.
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.
Tags und Links dependency-injection factory-pattern constructor-injection