Bei großen und komplexen Softwareprodukten wird die Verwaltung konfigurierbarer Einstellungen zu einem großen Problem. Zwei Ansätze, die ich für das Problem gesehen habe, sind:
- Lassen Sie jede Komponente im System ihre eigene Konfiguration aus Konfigurationsdateien oder Registrierungseinstellungen laden.
- Haben Sie eine Settings Loader-Klasse, die alle konfigurierbaren Systemeinstellungen lädt, und lassen Sie jede Komponente den Settings Loader nach ihren Einstellungen abfragen.
Diese Ansätze fühlen sich für mich beide falsch an.
Gibt es Entwurfsmuster, die zur Vereinfachung des Problems verwendet werden könnten? Vielleicht etwas, das die Abhängigkeitsinjektionstechnik ausnutzen würde.
Antworten:
Ich bevorzuge es, eine Schnittstelle zum Festlegen von Abfragen, Laden und Speichern zu erstellen. Durch die Verwendung der Abhängigkeitsinjektion kann ich diese in jede Komponente injizieren, die dies erfordert.
Dies ermöglicht Flexibilität beim Ersetzen der Konfigurationsstrategie und bietet eine gemeinsame Basis für alles, worauf es ankommt. Ich ziehe dies einem einzelnen globalen "Einstellungslader" vor (Ihre Option 2), insbesondere da ich den Konfigurationsmechanismus für eine einzelne Komponente überschreiben kann, wenn ich dies unbedingt tun muss.
quelle
Ich arbeite derzeit auf einem System, auf dem die Konfiguration von einem globalen Singleton-Objekt verwaltet wird, das eine Zuordnung von Konfigurationsschlüsseln zu Werten enthält. Im Allgemeinen wünschte ich mir, es wäre nicht so gemacht worden, weil es zu Parallelitätsengpässen im System führen kann und für Unit-Tests usw. schlampig ist.
Ich denke, Reed Copsey hat das Recht dazu (ich habe ihn gewählt), aber ich würde definitiv empfehlen, Martin Fowlers großartigen Artikel über Abhängigkeitsinjektion zu lesen:
http://martinfowler.com/articles/injection.html
Ein kleiner Nachtrag auch ... Wenn Sie einen Mock-Objekttyp-Unit-Test durchführen möchten, ist die Abhängigkeitsinjektion definitiv der richtige Weg.
quelle
ll be flexible with adding new things to your config. Sure as all approaches this have it
Vor- und Nachteile.Wie wäre es damit. Sie definieren eine Schnittstelle, die mit einer einzigen Methode konfiguriert werden kann. Konfigurieren (Konfiguration). Das Konfigurationsargument ist einfach eine Hashtabelle, die die Namen der Konfigurationsparameter mit ihren Werten verknüpft.
Root-Objekte können eine Konfigurations-Hashtabelle nach Belieben erstellen (z. B. Lesen aus einer Konfigurationsdatei). Diese Hashtabelle kann Konfigurationsparameter für das Stammobjekt iselft sowie alle Parameter enthalten, die eine ihrer Komponenten, Unterkomponenten, Unterunterkomponenten (usw.) möglicherweise verwendet.
Das Root-Objekt ruft dann configure (configuration) für alle konfigurierbaren Komponenten auf.
quelle
Sie können mehrere Implementierungen einer Schnittstelle erstellen, die den Konfigurationslader definiert. Grundsätzlich Strategiemuster, bei dem Sie eine grundlegende Schnittstelle als configLoader und anschließend weitere verschiedene Implementierungen wie FileSystemLoader, ClasspathLoader, EnvVariablesLoader usw. definieren können. Details unter diesem Link
quelle