In .NET-Anwendungen sehen wir häufig, dass die von VS für uns generierten Projektprojekte Dateien wie App.config oder Web.config enthalten. Diese Datei nennen wir die Anwendungskonfigurationsdatei. Diese Datei beschreibt einige Informationen zu unserer Anwendung, z. B. Datenbankverbindung, Authentifizierungsmodus usw. Im Programm können wir die ConnectionStrings-Eigenschaft von ConfigurationManager verwenden, um bequem die Datenbankverbindungszeichenfolgeninformationen in der Konfigurationsdatei abzurufen.
Aber manchmal müssen wir es erweitern und einige benutzerdefinierte Elemente hinzufügen, anstatt nur die Standardkonfiguration zu verwenden. Beispielsweise müssen wir möglicherweise eine Klasse dynamisch laden und beim Programmstart initialisieren, diese Klasse oder Initialisierungsdaten sind uns jedoch während des Programmentwurfs unbekannt. Ich glaube, dass jeder auf ein solches Problem gestoßen ist, deshalb werde ich es hier nicht zu ausführlich erklären. Der beste Weg ist, diese Dinge, die sich ändern können, in die Konfigurationsdatei zu schreiben. Wenn Sie sicher sind, müssen Sie nur die Konfigurationsdatei ändern, anstatt sich 30 Sekunden Zeit zu nehmen, um VS zu öffnen und Änderungen vorzunehmen der Code.
Das Hinzufügen einiger benutzerdefinierter Elemente zu einer Konfigurationsdatei ist einfach und erfordert nur zwei Schritte:
1. Registrieren Sie den Knotennamen, den Sie definieren möchten, und den Konfigurationsabschnittshandler, der zum Verarbeiten des Knotens im Knoten <configSections> verwendet wird. Der Code lautet wie folgt:
1 <configSections>2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/>3 </configSections>
2. Fügen Sie benutzerdefinierte Knoten an den entsprechenden Stellen hinzu. Der Code lautet wie folgt:
1 <configSections> 2 <section name="dbFactory" type="DbFactory.Configuration.DbFactorySection,DbFactory.Configuration"/> 3 </configSections> 4 <dbFactory> 5 <default Factory="sql"></default> 6 <factorys> 7 <add name="sql" Assembly="Hello.Data" class="SqlDbFactory" /> 8 <add name="oracle" Assembly="Hello.Data" class="OracleDbFactory" /> 9 </ Fabriken>10 </dbFactory>
Der benutzerdefinierte Knoten wurde hinzugefügt, aber wie erhalten wir diese Konfigurationsinformationen im Programm? Ich glaube, dass viele von Ihnen Experten im Umgang mit XML sind, wenn Sie einige Klassen unter System verwenden. Das ist tatsächlich so. Der Meister ist wirklich ein Meister. Aber wenn es so umgesetzt wird, besteht für mich eigentlich keine Notwendigkeit, diesen Blogbeitrag zu schreiben.
Das .Net-Framework implementiert viele Konfigurations-APIs, um unsere Vorgänge an Konfigurationsdateien zu vereinfachen. Im ersten Schritt haben wir den Konfigurationsabschnittshandler erwähnt, der zum Lesen und Schreiben unserer benutzerdefinierten Knoteninformationen verwendet wird. Wie implementieren wir also einen Konfigurationsabschnittshandler? Werfen wir zunächst einen Blick auf die zugehörigen Klassen und Konzepte.
ConfigurationSection: Benutzerdefinierte Knoten müssen diese Klasse erben, um eine benutzerdefinierte Verarbeitung und programmgesteuerten Zugriff auf den benutzerdefinierten Konfigurationsabschnitt bereitzustellen.
ConfigurationElement: Es stellt ein Element innerhalb der Konfigurationsdatei dar.
ConfigurationElementCollection: Stellt ein Konfigurationselement dar, das eine Sammlung untergeordneter Elemente enthält.
Mit diesen Klassen können wir zusammenfassen, dass es in der Konfigurationsdatei zwei Arten von Konfigurationselementen gibt.
Erstens ist ein einzelnes Konfigurationselement ein Element, das von ConfigurationElement erbt und keine untergeordneten Elemente enthält.
Zweitens ist das Sammlungskonfigurationselement ein von ConfigurationElementCollection geerbtes Element, das eine Sammlung untergeordneter Elemente enthält.
Um diese Dinge zu verstehen, sollten wir sie anhand der oben genannten Beispiele ausführlich erläutern.
Der Konfigurationsabschnitt <dbFactory> enthält zwei Elemente, nämlich <default> und <factorys>, und das Element <factorys> enthält zwei Unterelemente. Hier ist also <default> ein einzelnes Konfigurationselement und <factorys> ein Sammlungskonfigurationselement. Wir müssen die Klassen und ihre Eigenschaften entsprechend diesen Elementen implementieren.
<Standard>-Element: Es handelt sich um ein Einzeltypelement, daher erben wir ConfigurationElement. In diesem Element gibt es ein Factory-Attribut, daher definieren wir es entsprechend in der Klasse. Der Code lautet wie folgt:
Code
öffentliche Klasse DefaultElement: ConfigurationElement { [ConfigurationProperty("factory")] public string Factory { get { return this["factory"] as string } set { this["factory"] = value;
Hinweis: Wir müssen das ConfigurationProperty-Attribut der Eigenschaft oberhalb der Eigenschaftsdefinition registrieren.
<factorys> untergeordnete Elemente:
Code
öffentliche Klasse FactoryElement : ConfigurationElement { [ConfigurationProperty( "name" )] public string Name { get { return this["name"] as string } set { this["name"] = value; )] public string Assembly { get { return this["assembly"] as string } } set { this["assembly"] = value; } } [ConfigurationProperty("class")] public string Class { get { return this[" class"] als String; } set { this["class"] = value; } } }
Das <factorys>-Element ist ein Sammlungselement und erbt ConfigurationElementCollection.
Code
public class FactoryElements : ConfigurationElementCollection { protected override ConfigurationElement CreateNewElement() { return new FactoryElement(); } protected override object GetElementKey( ConfigurationElement element ) { return ((FactoryElement)element).Name } public FactoryElement this[string name] { get { return BaseGet( name ) as FactoryElement; } } }
Die Klasse „ConfigurationElementCollection“ ist eine abstrakte Klasse und Sie sollten ihre Methoden „CreateNewElement“ und „GetElementKey“ explizit implementieren.
<dbFactory>-Knoten, geerbt von ConfigurationSection
Code
public class DbFactorySection : ConfigurationSection { [ConfigurationProperty("default")] public DefaultElement DefaultFactory { get { return this["default"] as DefaultElement; } set { this["default"] = value; )] public FactoryElements Factorys { get { return this["factorys"] as FactoryElements } set { this["factorys"] = value;
Der Konfigurationsabschnittshandler ist endlich fertig. Legen Sie diese vier Klassen im selben Projektverzeichnis ab und kompilieren Sie sie in eine DLL. Wenn Sie Konfigurationsinformationen benötigen, verweisen Sie auf diese DLL und verwenden Sie DbFactorySection section = ConfigurationManager.GetSection( "dbFactory" ) as DbFactorySection. Probieren Sie es aus.