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 IMotor
mit konkreten Typen Motor1
und Motor2
, der von einer Fabrik gehandhabt werden sollte. Es gibt jetzt zwei Möglichkeiten, wie ich mein Gerät konfigurieren kann:
- Ich übergebe Informationen über das Gerät, auf dem die Software läuft, an a
MotorFactory
und es gibt entwederMotor1
oder den richtigen Motor zurückMotor2
. In diesem Fall befindet sich die Entscheidungslogik in der Fabrik. - Ich konfiguriere den DIC entsprechend dem Gerät, auf dem er ausgeführt wird, und erstelle zwei Fabriken
Motor1Factory
undMotor2Factory
, wo eine erstelltMotor1
und die andereMotor2
. In diesem Fall hätte ich unterschiedliche Registrierungseinträge fürIMotor
die gerätespezifischen Registrierungen, die entwederMotor1Factory
oder verwendenMotor2Factory
.
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?
quelle
Antworten:
Wenn Sie beide verwenden, werde ich mich für etwas Einfaches entscheiden:
quelle
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
Motor1
undMotor2
heute wählen , morgen jedoch eineMotor3
. Bevorzugen Sie das Design, das sichMotor3
leicht hinzufügen lässt.quelle
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:
quelle