2009-07-28 3 views
7

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?

Antwort

2

Okay, ich denke, ich habe die Antwort gefunden, zumindest für meine spezielle Version dieses Problems.

Das .NET 2.0 ConfigurationManager unterstützt ein file Attribut auf dem appSettings Element. Dadurch können Sie den Inhalt dieses Elements aus einer externen Datei abrufen. Also, was ich tue, ist:

  1. Schneiden Sie das appSettings Element aus foo.exe.config und fügen Sie ihn in eine andere Datei in diesem Verzeichnis mit dem Namen, sagen wir mal, appSettings.xml.

  2. Fügen Sie ein neues Element zu foo.exe.config hinzu: <appSettings file="appSettings.xml"/>.

  3. ein Element bar.exe.config hinzufügen: <appSettings file="c:\program files\foo\appSettings.xml"/>

Dies funktioniert. Aber es funktioniert nur, weil mein Programm appSettings überhaupt nicht verwendet.

2

Sie könnten einfach load their configuration file.

+0

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. –

Verwandte Themen