Wie Liest man einen Abschnitt Konfiguration von XML in eine Datenbank?
Habe ich eine Config-Klasse wie folgt aus:
public class MyConfig : ConfigurationSection
{
[ConfigurationProperty("MyProperty", IsRequired = true)]
public string MyProperty
{
get { return (string)this["MyProperty"]; }
set { this["MyProperty"] = value; }
}
}
Und es instanziiert wird von einer anderen Klasse wie diese
(MyConfig)ConfigurationManager.GetSection("myConfig")
Sind wir ein paar Veränderungen vornehmen und sind jetzt die Speicherung der Konfigurations-Datei in der DB als xml, genau wie es derzeit in der config-Datei.
Möchte ich pflegen den MyConfig als ConfigurationSection für die rückwärts-Kompatibilität, aber immer noch in der Lage sein zu instanziieren es mit dem XML-string werden aus der DB.
Ist es möglich? Wenn ja, wie? (Denken Sie daran, es sollte trotzdem funktionieren, als instanziiert oben)
- Ich würde Liebe, um eine Lösung für dieses - habe ich seit der recherche für eine Weile, ohne viel Erfolg, leider....
- Ich bin froh zu sehen, dass ich nicht allein bin.
- Ich weiß nicht, die Antwort auf diese ein, weil es scheint, dass der Speicherort der Konfigurations-Dateien können nicht geändert werden durch die Anwendung code. Aber ich würde nicht überlastet werden Konfigurationsdateien für das Szenario und würde meine Konfiguration Leser, die die Daten aus der DB.
- Ich habe schon ernsthaft in Erwägung zu tun, was Sie vorgeschlagen. Ich dachte schon, ich hätte vor dem Einzug in diese Richtung
- naja, das Hauptproblem ist, dass ich konnte nicht wirklich einen Weg finden, um meine plug-eigenen Datenbank-basierten config-reader. Das ganze .NET Konfiguration-system ist leider nicht provider-basierte (wie so viele andere Dinge .NET), und viele der relevanten Klassen sind versiegelt und verwenden interne und private Methoden 🙁
Du musst angemeldet sein, um einen Kommentar abzugeben.
Mein Vorschlag wäre, zu halten Ihre aktuelle MyConfig Klasse, aber laden Sie Ihre XML-Daten aus Ihrer Datenbank in den Konstruktor, die dann in jede Eigenschaft der MyConfig, können Sie in Logik, um zu bestimmen, wo Sie den Wert aus (entweder Datenbank oder .config-Datei), wenn Sie brauchen, um pull-config entweder Ort, oder Sie fallen zurück, wenn der Wert leer ist.
Hier ist, wie ich in der Regel tun Sie es: fügen Sie einfach diesen Mitgliedern die MyConfig Klasse:
Diese Weise, Sie haben nichts zu ändern, in der MyConfig Klasse, aber Sie noch brauchen, um zu ändern, wie Sie Ihre Kunden mit dieser Art von code:
Wenn Sie brauchen, um jede System.- Konfiguration.ConfigurationSection in der Datenbank gespeichert, können Sie prüfen, schriftlich generic Abschnitt reader wie diese:
Dieser Arbeit wird für alle Klassen, überschreiben DeserializeElement Methode. z.B.
Als Sie bekommen konnte, einen Abschnitt wie diesen:
Dies ist ein hartes problem. Sie könnten eine config-Datei mit absichtlich falschen XML überschreiben OnDeserializeUnrecognizedElement in Ihrem ConfigurationSection und dann effektiv umgehen, die Datei zu ConfigurationSection-Zuordnung (im wesentlichen Ihre Eigenschaften festzulegen manuell) - einige Umgestaltung nötig wäre, aber Sie können trotzdem die gleichen Eigenschaften usw. Es ist ein bisschen WTF, aber vielleicht praktikabel.
Ich im wesentlichen beschreiben wie dies mit LINQ to XML in diesem blog-post. In allen meinen code jetzt ich don ' T haben Klassen, die sich auf ConfigurationSection, ich benutze die Technik, beschrieben in meinem blog-post zu umgehen, und kehren POCOs über eine Schnittstelle. Das hat meinen code mehr als Einheit getestet werden, wie kann ich leicht ein stub für die Schnittstelle.
Kann ich auch einfach meine Konfiguration in einer DB sollte ich so tun möchten - ich erstelle einfach eine neue Klasse, die meiner Konfiguration-Schnittstelle und wechseln Sie es in meinem IoC-Konfiguration. Microsoft hat nicht die Konfiguration-system, um flexibel zu sein, also musst du Rücksicht nehmen, wenn Sie es in Ihrem eigenen code.
Die einzige weitere Weise kann ich denken, schreiben die DB-config in eine Datei und dann Lesen Sie es in, aber das ist auch seltsam!
Eher alte Frage, aber nur spielen, um mit einer Lösung für dieses. Es ist so ähnlich wie Simon Mourier Ansatz (die ich mag besser in einigen Möglichkeiten - weniger hacky) aber bedeutet, dass jeder code, der Aufrufe
System.Configuration.ConfigurationManager.GetSection()
weiter zu arbeiten, ohne zu ändern, verwenden Sie die statische Methode, so dass Sie möglicherweise weniger code ändern insgesamt.Den ersten grundlegenden Nachteil ist, ich habe keine Ahnung, ob dies funktioniert auch mit verschachtelten Abschnitte, aber ich bin fast sicher, es wird nicht. Die fast-wichtigste Einschränkung ist, dass es erfordert änderungen in der config-Abschnitt der Klasse, so können Sie nur verwenden Sie benutzerdefinierte Abschnitte, die Sie haben, die Quelle zu (und ändern dürfen!)
Zweiten und WICHTIGSTE VORBEHALT ist, dass ich nur spielen, um mit dieser, ich bin nicht mit entweder-Entwicklung und definitiv nicht für die Produktion, und einfach Verschmieren meinem eigenen code über die Basis-Funktionalität, wie dies kann sehr wohl Auswirkungen, die nicht zeigen, bis in meinem Beispiel. Nutzung auf eigene Gefahr.
(Having said, die, ich Teste es in einer Umbraco-Website so mit vielen anderen config-Abschnitte gehen auf, und Sie noch alle Arbeit, so dass ich denke, es hat nicht sofort die schrecklichen Auswirkungen)
EDIT: Das ist es .NET 4, nicht 3,5, wie pro die ursprüngliche Frage. Keine Ahnung, ob das wil einen Unterschied machen.
So, hier ist der code, Recht einfach, einfach überschreiben
DeserializeSection
Sie eine XML-reader, der lädt aus einer Datenbank.Ich bin mit ASP.Net so, damit es funktioniert, brauchen Sie einen
web.config
, aber dann hey, ich muss irgendwo für Verbindungszeichenfolgen, eh, oder ich werde nicht auf eine Verbindung zu einer Datenbank überhaupt.Ihren benutzerdefinierten Bereich definiert werden sollte als normal in
<configSections/>
; der Schlüssel zu dieser Arbeit ist es, dann legen Sie ein leeres element an der Stelle Ihrer normalen Einstellungen; D. H. an Stelle von<TestSettings configSource="..."/>
oder Sie inline-Einstellungen, setzen Sie sich einfach<TestSettings/>
Configuration manager dann laden Sie alle Abschnitte finden Sie in der bestehenden
<TestSettings/>
element, und deserialisiert Sie, an welcher Stelle es trifft überschreiben und lädt die XML-Daten aus der Datenbank statt.HINWEIS: Die Deserialisieren erwartet, dass ein Dokument-fragment (er erwartet, dass Sie aufgerufen werden, wenn der Leser befindet sich bereits in einem Knoten), nicht ein ganzes Dokument, also, wenn Sie Ihre Abschnitte werden in separaten Dateien gespeichert, müssen Sie entfernen die
<?xml ?>
erste Erklärung, oder Sie bekommenExpected to find an element
.