Ich schreibe Anwendungen, die mit einer Anwendung eines Drittanbieters zusammenarbeiten. Diese Anwendung stellt Entwicklern über Methoden in einer DLL eine API zur Verfügung. Vor einiger Zeit begann der Anbieter dieser App ihre eigenen .NET-Komponenten in ihr Programm zu integrieren. Als sie das taten, entschieden sie, dass ihre Komponenten die ConfigurationManager
verwenden sollten, um Einstellungen zur Laufzeit zu erhalten.Wie kann ich ConfigurationManager laden, um Anwendungseinstellungen aus mehreren Dateien zu laden?
Was das bedeutet: ihr Programm, foo.exe
, ruft fooengine.dll
, und es liest seine Einstellungen von foo.exe.config
. Mein Programm, bar.exe
, ruft auch fooengine.dll
, und es liest seine Einstellungen von bar.exe.config
.
Nun, das ist einfach falsch. Aber wie repariere ich es? Die einfache Lösung besteht darin, die Einstellungen foo.exe.config
in bar.exe.config
zu replizieren. Das wird funktionieren, aber es ist dumm. Dies bedeutet, dass aus administrativer Sicht eine bestimmte Einstellung in N verschiedenen Dateien beibehalten werden muss. Das wird früher oder später scheitern.
Ich habe versucht, ein configSource
Attribut auf dem appSettings
Abschnitt in meiner Konfigurationsdatei. (Wie es passiert, verwende ich die applicationSettings
Abschnitt für meine Einstellungen, und sie verwenden die appSettings
Abschnitt für ihre, so kann ich damit leben einfach diesen Abschnitt aus einer anderen Datei zu bekommen.) Aber die ConfigurationManager
nicht so : Es möchte der Pfad in configSource
nicht nur relativ zu aber unter mein Programmverzeichnis sein.
Ich kann ihre Einstellungsdatei in eine XmlDocument
physikalisch lesen und sie dann selbst einstellen. Aber jetzt kopple ich meinen Code fest mit ihrer Implementierung; Wenn sie eine neue Version veröffentlichen, die die Einstellungen in den Bereich applicationSettings
(wo sie sollte jetzt sein, dass es 2009 ist) verschiebt, wird mein Code brechen.
Gibt es einen anderen Ausweg?
Ich glaube nicht, "nur" ist das richtige Wort.Ich kann OpenMappedMachineConfiguration aufrufen, um ein Configuration-Objekt abzurufen. Aber das aktualisiert den ConfigurationManager nicht. Und es ist nicht trivial, von dort sogar zu einer Liste von Name/Wert-Paaren zu gelangen (beachte, die andere App verwendet den alten "appSettings" -Abschnitt, nicht den aktuellen "applicationSettings" -Abschnitt - GetSection gibt das als DefaultSection-Objekt zurück) . Es ist ein bisschen weniger Code, um nur die Datei in ein XmlDocument zu lesen. –