2009-04-11 15 views
13

Das .NET 2.0 und höher Konfigurationssystem ist ziemlich mächtig und erweiterbar - solange Sie nicht die Tatsache ändern wollen, alles kommt aus XML-Dateien im Dateisystem.Lesen Sie .NET-Konfiguration aus der Datenbank

In meiner Anforderung kann ich Dateien nicht ändern, da meine App in einer verwalteten Umgebung außerhalb meiner Reichweite ausgeführt wird - aber ich könnte die SQL Server-Datenbank ändern.

Ich schaue mir also an, Konfigurationsdateien oder Abschnitte in einer SQL-Tabelle zu speichern - aber wie kann ich das .NET 2.0-Konfigurationssystem daran binden?

Gibt es eine Möglichkeit, einen "benutzerdefinierten Konfigurationsanbieter" zu schreiben, der seine Konfigurationsabschnitte nicht aus einer * .config-Datei im Dateisystem liest, sondern aus einer Tabelle in der SQL-Datenbank?

Ich habe versucht, meine eigene benutzerdefinierte ConfigurationSection oder ConfigurationElement oder sogar eine benutzerdefinierte Konfiguration per se zu erstellen - aber es scheint, ich immer wieder an dem Punkt, dass ich das Config-System im Dateisystem so viel erweitern kann wie ich mag, aber ich kann es nicht meine XML-Fragmente aus einer Datenbanktabelle lesen lassen ...

Was vermisse ich? Hat jemand das schon gemacht und sich darum kümmern zu erklären/teilen?

Danke! Marc

PS: Ich habe auch versucht, nur die Config-XML in eine Zeichenfolge zu lesen, und dann es in das entsprechende zu deserialisieren. ServiceModelConfigSection - das funktioniert leider nicht, weil die ConfigSection-Basisklasse irgendwie keine Methode implementiert, die für XML serialisierbar sein muss ........ (YIKES !!!)

+0

Aber hätten Sie nicht das Problem, wo Sie die Konfigurationsinformationen für Ihre SQL-Verbindung festlegen müssen? Sobald Sie eine Verbindung zur DB haben, können Sie einfach die Einstellungen laden, die Sie benötigen. App.Config ist nicht viel mehr als eine Nachschlagetabelle. – sipwiz

+0

Ja - was ich versuche zu erreichen ist, WCF-Dienste innerhalb einer Datenbank zu konfigurieren. Diese WCF-Konfigurationsdateien sind QUITE LARGE AND COMPLEX - und ich möchte wirklich nicht all diese Dinge in atomare Aufgaben aufteilen -> Ich würde gerne die XML-Konfigurationsdatei aus der Datenbank lesen und anwenden. –

+0

Ah ok, das macht mehr Sinn, ich kann sehen, warum WCF-Konfigurationen von einer db wäre praktisch. Ich vermute, dass Sie Recht haben und es muss eine Möglichkeit geben, App.Config als Stream oder Block von XML statt einer Datei einzulesen. – sipwiz

Antwort

5

There's Artikel hier, die über das tun spricht, wovon Sie sprechen über sich selbst:

http://www.wrox.com/WileyCDA/Section/Redirecting-Configuration-with-a-Custom-Provider.id-291932.html

Zusammengefasst, was sie tun, ist eine abgeleitete Version von ProtectedConfigurationProvider erstellen, die in der Regel zu verschlüsseln CONFIG-Dateien verwendet wird. In der Decrypt-Methode wird die Konfigurationsinformation nicht entschlüsselt, sondern aus einer Datenbank abgerufen.

+0

+1 - danke, sehr interessant! Ich kann den "ProtectedConfigurationProvider" noch nicht als Basisklasse verstehen, aber ich werde es versuchen! –

+2

Hallo Keltex - es funktioniert - meistens - aber es ist ein ziemlich schrecklicher HACK meiner Meinung nach ... schade, es gibt keinen "richtigen", netten, offiziellen Weg, Konfig Provider direkt in das .NET config system einzubauen ... .. –

+0

@marc_s stimme ich zu. Aber es ist ein Workaround. – Keltex

1

Sie kann versuchen Cinchoo framework für Ihre Bedürfnisse.

Es unterstützt das Lesen und Schreiben Konfigurationseinträge in Datei, Registry, INI, Datenbank usw.

Hier ist die einfache Art und Weise ist das Konfigurationsobjekt mit Cinchoo Rahmen

namespace HelloWorld 
{ 
    #region NameSpaces 

    using System; 
    using Cinchoo.Core.Configuration; 

    #endregion NameSpaces 

    [ChoConfigurationSection("sample")] 
    public class SampleConfigSection : ChoConfigurableObject 
    { 
     [ChoPropertyInfo("name", DefaultValue="Mark")] 
     public string Name; 

     [ChoPropertyInfo("message", DefaultValue="Hello World!")] 
     public string Message; 
    } 

    static void Main(string[] args) 
    { 
     SampleConfigSection sampleConfigSection = new SampleConfigSection(); 
     Console.WriteLine(sampleConfigSection.ToString()); 
    } 

} 

ersten Mal zu definieren und verwenden Wenn Sie die Anwendung ausführen, generiert Cinchoo Framework automatisch den Konfigurationsabschnitt wie folgt. Ab dann können Sie sie entweder über die Konfigurationsquelle oder per Code steuern.

<?xml version="1.0" encoding="utf-8"?> 
<configuration> 
    <configSections> 
    <section name="sample" type="Cinchoo.Core.Configuration.ChoNameValueSectionHandler, Cinchoo.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=b7dacd80ff3e33de" /> 
    </configSections> 
    <sample> 
    <add key="name" value="Mark" /> 
    <add key="message" value="Hello World!" /> 
    </sample> 
</configuration> 

Versuchen Sie es!

3

Sie können das gleiche XML-Parsing verwenden, das .NET beim Lesen der web.config- und Konfigurationsabschnitte mit einiger Reflektion verwendet.

Hier ist die sample code, es zu tun.

Hier ist eine Klasse, die Sie in XML darstellen möchten.

So instanziieren Sie diese ConfigurationSection mithilfe von XML aus einer Zeichenfolge (oder einer Datenbank). Dies wurde den Tests auf GitHub entnommen, die im obigen Blogpost verlinkt wurden.

Sie erhalten den gesamten .NET-Lift mit diesem Ansatz unter Verwendung des System.Configuration-Namespace.

+1

Schön! Das hat super für mich funktioniert. Das einzige Problem war, dass ich sicherstellen musste, dass mein XML keine führenden CRLFs/Whitespaces enthielt. Obwohl einige Leute sagen, dass es gefährlich ist, sich auf private CLR-Methoden wie diese zu verlassen, ist es für mich viel weniger skizzenhaft als der Code, den ich umgestalten möchte. Dies ist ein großartiges Gerüst, um einige dieser Dinge zu unterstützen, während ich das Hauptproblem angreife. Danke noch einmal! – killthrush

Verwandte Themen