DI / IoC-Container gegen Fabriken: Wo konfiguriere ich meine Anwendung und warum?

9

Ich versuche herauszufinden, wann die DIC / IoC-Registrierung für die Konfiguration meiner Software und wann Fabriken verwendet werden sollen, zusammen mit den Gründen für beide Ansätze.


Ich verwende StructureMap als meinen DI-Container (DIC), der mithilfe von Registern einfach zu konfigurieren ist. In der DIC sind praktisch alle registrierten Objekte statisch in dem Sinne, dass ich zur Laufzeit keine Implementierung / Instanz ändern / austauschen muss, sobald die DIC konfiguriert ist und sie in der DIC als Singletons konfiguriert sind. Da jedoch meine Software (SW) auf verschiedenen Geräten laufen werde ich tun Notwendigkeit einer gerätespezifischen Registrierung auszuwählen , auf dem Gerät abhängig , dass meine SW läuft auf , um die Hardware entsprechend zu konfigurieren.

Da für die Erstellung einiger meiner Objekte Konfigurationsdateien eingelesen werden müssen, verwende ich Fabriken, um diese Instanzen an die DIC zurückzugeben, um das Lesen der Konfiguration von der Erstellung des Objekts zu trennen. Ich habe die Factory Getter im DIC für die entsprechenden Plugin-Typen registriert.

Sagen wir jetzt, ich habe einen Plugin-Typ IMotormit konkreten Typen Motor1und Motor2, der von einer Fabrik gehandhabt werden sollte. Es gibt jetzt zwei Möglichkeiten, wie ich mein Gerät konfigurieren kann:

  1. Ich übergebe Informationen über das Gerät, auf dem die Software läuft, an a MotorFactoryund es gibt entweder Motor1oder den richtigen Motor zurück Motor2. In diesem Fall befindet sich die Entscheidungslogik in der Fabrik.
  2. Ich konfiguriere den DIC entsprechend dem Gerät, auf dem er ausgeführt wird, und erstelle zwei Fabriken Motor1Factoryund Motor2Factory, wo eine erstellt Motor1und die andere Motor2. In diesem Fall hätte ich unterschiedliche Registrierungseinträge für IMotordie gerätespezifischen Registrierungen, die entweder Motor1Factoryoder verwenden Motor2Factory.

Meine Frage ist nun: Welche dieser beiden Methoden sind vorzuziehen und warum? Für mich scheint der erste Fall nicht einfach und kompliziert zu sein, da ich die Logik verteile, die entscheidet, welcher Typ in der gesamten Codebasis instanziiert werden soll. Im zweiten Fall multipliziere ich effektiv die Anzahl der Fabriken in meinem Code, da ich für (fast) jeden Betontyp eine Fabrik benötige. Es wird für mich noch verwirrender, wenn dem Mix abstrakte Fabriken hinzugefügt werden.

Also nochmal: Wann sollte ich die eine oder andere Methode anwenden? Und was noch wichtiger ist: Was sind gute Indikatoren für die Entscheidung, welchen Weg Sie gehen sollen?

Packoman
quelle
2
Welcher Weg ist einfacher? Wiegen die Vorteile des komplexeren Ansatzes die Kosten der zusätzlichen Komplexität auf?
Robert Harvey

Antworten:

2

Wenn Sie beide verwenden, werde ich mich für etwas Einfaches entscheiden:

  • DI / IoC: für jede Konfiguration, die zur Laufzeit nicht geändert wird.
  • Factory: Zum Erstellen einer Instanz von Objekten zur Laufzeit, die von den Laufzeit-Eingabeparametern abhängt. Die Instanzen der Fabrik werden vom DI-Behälter injiziert.
Walfrat
quelle
1

Abstrakte Fabriken werden verwendet, wenn Sie Objekte haben, die über eine Hierarchie miteinander verbunden sind, die zusammen variieren muss. Das sehe ich hier nicht.

Ich sehe, dass Sie sich fragen, ob eine Fabrik den Motor wählen sollte oder ob der DIC eine Fabrik wählen sollte, die einen bestimmten Motor produziert.

Es ist schwer, genau zu wählen, weil eine Fabrik und ein DIC sehr ähnliche Dinge tun. Der Unterschied besteht darin, dass sich die Fabrik auf ein bestimmtes Thema konzentriert und der DIC allgemeiner ist.

Es kommt auf diese Frage an: Benötigen Sie Code für dieses Problem, der in der Fabrik ausgeführt wird? Oder ist es allgemeiner, Konfigurationsdetails aus einer Datei zu lesen?

Denken Sie daran, dass Sie möglicherweise nur zwischen Motor1und Motor2heute wählen , morgen jedoch eine Motor3. Bevorzugen Sie das Design, das sich Motor3leicht hinzufügen lässt.

candied_orange
quelle
0

Ich würde die Logik "welcher Motor verwendet werden soll" in eine spezielle Fabrik namens Builder (Muster) aufteilen und den IOC-Container für beide Motoren als Implementierungsdetail des Builders verwenden.

Generell:

  • Sie benötigen eine Factory (oder einen Builder), wenn Sie viele dynamische Objekte der Klasse / Schnittstelle erstellen müssen. (dh für jedes Auto, das Sie produzieren, müssen Sie einen neuen Motor erstellen)
  • Wenn Sie nur eine statische Instanz einer Klasse benötigen, kann das ioc / di die Aufgabe für Sie erledigen (dh Sie benötigen nur eine statische Instanz des Zahlungsdienstes und eine statische Instanz des MotorBuilderService).
k3b
quelle