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?