Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. ASP.NET

Wie kann man benutzerdefinierte Konfigurationseinstellungen für eine (ASP).NET-Anwendung hinzufügen?

by
Read Time:13 minsLanguages:

German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)

Seit seiner Veröffentlichung haben ASP.NET-Anwendungen und -Komponenten die Datei web.config durchsucht, um alle Einstellungen zu laden, die sie zum Funktionieren benötigen. Das Hinzufügen benutzerdefinierter Einstellungen, um einer Anwendung oder Komponente Flexibilität und Robustheit zu verleihen, ist jedoch nicht so einfach, wie es die meisten möchten. In diesem Artikel erfahren Sie, wie Sie die erforderlichen Klassen für den Umgang mit XML-Konfigurationselementen schreiben und die in Ihrem Code enthaltenen Einstellungen verwenden.

Neu veröffentlichtes Tutorial

Alle paar Wochen besuchen wir einige der Lieblingsbeiträge unserer Leser aus der gesamten Geschichte der Website. Dieses Tutorial wurde erstmals im November 2012 veröffentlicht.

Das .NET Framework bietet eine Vielzahl von Einstellungen, die in web.config konfiguriert werden können, um das Verhalten einer oder mehrerer integrierter Komponenten in der Anwendung zu ändern. Für einige Entwickler ist es ausreichend, sich nur an die von .NET Framework bereitgestellten Einstellungen zu halten. Viele weitere Entwickler müssen jedoch eine breitere Sammlung von Einstellungen steuern - entweder für Komponenten (von ihnen selbst oder von Dritten geschrieben) oder einfach für eine Reihe von Werten, die sie in ihrer gesamten Anwendung verwenden.

In der Datei web.config können Sie benutzerdefinierte Einstellungen mit dem Element <appSettings/> festlegen, es sind jedoch nur einfache Schlüssel/Wert-Paare zulässig. Das folgende XML-Element ist ein Beispiel für eine Einstellung in <appSettings/>:

Schlüssel-/Werteinstellungen können unter vielen Umständen hilfreich sein, aber die Einstellungen von <appSettings/> sind für robuste oder komplexe Komponenten oder Einstellungen einfach nicht flexibel genug.

Zum Glück können Entwickler mit Microsoft Klassen schreiben, die programmgesteuerten Zugriff auf benutzerdefinierte Konfigurationseinstellungen in web.config hinzufügen.


Der Konfigurationsabschnitt

Die Einstellungen in web.config sind in Konfigurationsabschnitte unterteilt. Beispielsweise beziehen sich die im Abschnitt <system.web/> enthaltenen Einstellungen auf die ASP.NET-Einstellungen für Ihre Anwendung. Sie können das Authentifizierungsschema Ihrer App ändern sowie HTTP-Handler hinzufügen oder entfernen, um bestimmte Funktionen für bestimmte Dateitypen auszuführen. Im Abschnitt <system.webServer/> können Sie viele Einstellungen von IIS7 steuern, ohne direkten Zugriff auf IIS7 zu haben.

Für alle Einstellungen, die nicht im Element <appSettings/> enthalten sind, ist ein Konfigurationsabschnitt erforderlich. Es ist daher eine gute Idee, die XML-Struktur Ihrer Konfigurationseinstellungen zu entwerfen, bevor Sie Code schreiben.

Die in diesem Tutorial als Beispiel verwendete Konfiguration bezieht sich auf eine Komponente, die RSS- oder Atom-Feeds abruft. Es wird keine Analyse durchgeführt, da dies den Rahmen dieses Tutorials sprengt. Anstatt die Liste der abzurufenden Feeds fest zu codieren, überprüft die Komponente in ihrer Konfiguration die Namen und URLs der abzurufenden Feeds. Die Komponente heißt FeedRetriever und die gewünschte XML-Struktur ihrer Konfiguration sieht folgendermaßen aus:

Das Element <feedRetriever/> wird im Konfigurationsabschnitt definiert. In der Regel sollte ein Konfigurationsabschnitt den Namen der Komponente enthalten, für die er entwickelt wurde. Das einzige untergeordnete Element der <feedRetriever/> -Elemente ist das <feeds/> -Element. Stellen Sie sich dieses Element als eine Sammlung von Feeds vor, da es mehrere <add/> -Elemente enthält (denken Sie an die Add() -Methode, über die die meisten Sammlungsobjekte verfügen). Die Wahl der Verwendung eines Elements mit dem Namen "add" mag zunächst seltsam erscheinen, aber das <add/> -Element wird in den meisten integrierten Konfigurationsabschnitten verwendet. Die Verwendung hier folgt also einfach den von Microsoft festgelegten Entwurfspraktiken.

Diese <add/> -Elemente verwenden die Attribute name, url und cache, um bestimmte Einstellungen für jeden Feed festzulegen. Natürlich sind die Namens- und URL-Attribute erforderlich, das Cache-Attribut jedoch nicht und sollte standardmäßig true sein.

Die obige Konfiguration ist einfach. Das Element <feedRetriever/> kann so geändert werden, dass es ein anderes untergeordnetes Element namens <globalSettings/> enthält, das Einstellungen enthält, die für alle Feeds gelten. Die <add/> -Elemente können auch zusätzliche Attribute wie cacheTime und requestFrequency verwenden, um zu steuern, wie lange ein Feed zwischengespeichert wird und wie oft er vom Remote-Host angefordert wird. Die einzige Grenze für die Erweiterbarkeit und Konfigurierbarkeit ist Ihre Vorstellungskraft.


Schreiben des Konfigurationshandlers

Nach dem Entwerfen der XML-Struktur besteht der nächste Schritt darin, einen Konfigurationshandler zu schreiben, um die im XML definierten Einstellungen zu verarbeiten. Der Handler ist in erster Linie eine Klasse, die von System.Configuration.ConfigurationSection erbt, enthält jedoch auch die Verwendung anderer Klassen, z. B. Klassen, die von System.Configuration.ConfigurationElement und System.Configuration.ConfigurationElementCollection abgeleitet sind.

Auf ConfigurationElement basierende Klassen repräsentieren einzelne Elemente. Es ist der Baustein eines Konfigurationsabschnitts. Typen, die von ConfigurationElementCollection abgeleitet sind, stellen einfach Elemente dar, die mehr als einen Elementtyp enthalten. In der oben aufgeführten Konfiguration wird das Element <feeds/> durch eine Klasse dargestellt, die von ConfigurationElementCollection abgeleitet ist, und die Elemente <add/> werden durch eine ConfigurationElement-basierte Klasse dargestellt.


Darstellung des <add/> -Elements

Sie beginnen mit dem <add/> -Element, indem Sie es mit einer Klasse namens FeedElement (abgeleitet von ConfigurationElement) darstellen. Diese Klasse und zukünftige konfigurationsbezogene Klassen befinden sich im FeedRetriever.Configuration-Namespace.

Jedes ConfigurationElement-Objekt fungiert als Indexer für seine interne Sammlung von Eigenschaftswerten. Mit dieser internen Auflistung und den .NET-Attributen können Sie die Attribute des <add/> -Elements den Eigenschaften der FeedElement-Klasse zuordnen.

Der folgende Code ist der vollständige Code für die FeedElement-Klasse:

Die ConfigurationElement-Klasse dient als Indexer für eine zugrunde liegende Sammlung von Konfigurationseigenschaften (daher die Indexernotation dieses [keyValue]). Wenn Sie dieses Schlüsselwort verwenden und mit einem Zeichenfolgenschlüssel auf die zugrunde liegende Eigenschaft zugreifen, können Sie den Wert der Eigenschaft abrufen und festlegen, ohne dass ein privates Feld erforderlich ist, um diese Daten zu enthalten. Die zugrunde liegende Eigenschaftssammlung speichert Daten als Typ Objekt. Daher müssen Sie den Wert als geeigneten Typ umwandeln, wenn Sie etwas damit tun möchten.

Die Eigenschaften, die XML-Attribute darstellen, sind mit ConfigurationPropertyAttribute-Attributen versehen. Der erste Parameter des ConfigurationPropertyAttribute-Attributs ist der Name des XML-Attributs im <add/> -Element. Nach dem ersten Parameter folgt eine beliebige Anzahl benannter Parameter. Die folgende Liste ist eine vollständige Liste möglicher Parameter:

  • DefaultValue - Ruft den Standardwert für die dekorierte Eigenschaft ab oder legt diesen fest. Dieser Parameter
    ist nicht nötig.
  • IsDefaultCollection - Ruft einen booleschen Wert ab oder legt einen booleschen Wert fest, der angibt, ob die Eigenschaft vorhanden ist
    ist die Standardeigenschaftssammlung für die dekorierte Eigenschaft. Dieser Parameter ist
    nicht erforderlich, und der Standardwert ist false.
  • IsKey - Ruft einen booleschen Wert ab oder legt diesen fest, der angibt, ob diese Eigenschaft eine Schlüsseleigenschaft ist
    für das dekorierte Element Eigentum. Dieser Parameter ist nicht erforderlich und seine Standardeinstellung
    Wert ist falsch.
  • IsRequired - Ruft einen booleschen Wert ab oder legt diesen fest, der angibt, ob das dekorierte Element vorhanden ist
    Eigentum ist erforderlich. Dieser Parameter ist nicht erforderlich und sein Standardwert ist false.

Der Standardwert "http://localhost" für die Url-Eigenschaft ist kein Fehler. Mit .NET Framework können Sie die Eigenschaften auch mit Validatorattributen dekorieren, z. B. mit dem RegexStringValidatorAttribute, mit dem die Url-Eigenschaft dekoriert wird. Dieser Validator nimmt den Wert der Url-Eigenschaft und validiert ihn anhand des regulären Ausdrucks, der für das Attribut bereitgestellt wird. Es überprüft jedoch auch die Url-Eigenschaft, bevor sie die Daten aus dem XML-Element enthält. Der Standardwert der Url-Eigenschaft ist eine leere Zeichenfolge, wenn ein FeedElement-Objekt zum ersten Mal erstellt wird. Eine leere Zeichenfolge wird nicht anhand des angegebenen regulären Ausdrucks überprüft. Daher löst der Prüfer eine ArgumentException aus, bevor Daten aus der XML-Datei geladen werden.

Es gibt zwei mögliche Problemumgehungen für dieses Problem. Der erste Ansatz ändert den regulären Ausdruck, um leere Zeichenfolgen zuzulassen. Der zweite Ansatz weist der Eigenschaft einen Standardwert zu. In diesem speziellen Fall spielt es keine Rolle. Selbst mit einem Standardwert ist das URL-Attribut immer noch ein erforderliches Attribut im <add/> -Element. Die Anwendung löst eine ConfigurationErrorsException aus, wenn ein <add/> -Element kein URL-Attribut hat.

Es gibt mehrere andere Validatorattribute im System.Configuration-Namespace, um Daten zu validieren, die Eigenschaften zugewiesen sind, und die XML-Attribute, denen sie zugeordnet sind. Im Folgenden werden alle Validatorattribute im System.Configuration-Namespace aufgelistet:

Mit Ausnahme des CallbackValidatorAttribute müssen Sie keine entsprechenden Validatorobjekte erstellen, die in Verbindung mit den Validatorattributen verwendet werden sollen. Die .NET-Laufzeit erstellt die entsprechenden Validatorobjekte für Sie, und die Attribute enthalten die erforderlichen Parameter zum Konfigurieren der Validatorobjekte.

Dieses kleine Stück Code ist alles, was erforderlich ist, um einzelne <add/> -Elemente programmgesteuert darzustellen. Der nächste Schritt besteht darin, eine Klasse zu schreiben, die das Element <feeds/> darstellt.


Schreiben einer Elementsammlungsklasse

Die XML-Darstellung des Elements <feeds/> ist die einer Sammlung von Feedelementen. Ebenso ist die programmatische Darstellung des Elements <feeds/> eine Sammlung von FeedElement-Objekten. Diese Klasse mit dem Namen FeedElementCollection leitet sich von der abstrakten ConfigurationElementCollection-Klasse ab.

Die ConfigurationElementCollection-Klasse enthält mehrere Mitglieder, aber nur zwei sind als abstrakt markiert. Daher verfügt die einfachste Implementierung von ConfigurationElementCollection über zwei Methoden:

  • CreateNewElement() - Erstellt ein neues ConfigurationElement-Objekt (FeedElement in diesem
    Fall).
  • GetElementKey() - Ruft den Elementschlüssel für ein angegebenes Konfigurationselement ab (das
    Namenseigenschaft von FeedElement-Objekten in diesem Fall).

Zeigen Sie in diesem Sinne den vollständigen Code für die FeedElementCollection-Klasse unten an:

Ein ConfigurationCollectionAttribute schmückt diese Auflistungsklasse. Der erste Parameter für das Attribut ist ein Type-Objekt - der Typ der Elemente, die die Auflistung enthält. In diesem Fall handelt es sich um den FeedElement-Typ. Nach dem Typparameter befinden sich mehrere benannte Parameter, die Sie an das Attribut übergeben können. Diese sind unten aufgeführt:

  • AddItemName - Legt den Namen des Konfigurationselements <add/> fest. Beispielsweise,
    Wenn Sie dies als "feed" festlegen, sind die <add/> -Elemente in der Datei erforderlich
    Konfiguration, die in <feed/> geändert werden soll.
  • ClearItemsName - Legt den Namen des Konfigurationselements <clear/> fest (verwendet)
    um alle Elemente aus der Sammlung zu löschen).
  • RemoveItemName - Legt den Namen für das Konfigurationselement <remove/> fest (verwendet)
    um einen Gegenstand aus der Sammlung zu entfernen).

Wenn Sie diese benannten Parameter leer lassen, werden standardmäßig <add />, <clear />, <remove/> verwendet.


Schreiben der FeedRetreiverSection-Klasse

Die letzte Klasse mit dem Namen FeedRetrieverSection leitet sich von ConfigurationSection ab und repräsentiert das Element <feedRetriever />. Dies ist die einfachste Klasse der Konfigurationsklassen, da nur der programmgesteuerte Zugriff auf das Element <feeds/> (die FeedElementCollection) erforderlich ist.

Diese Eigenschaft vom Typ FeedElementCollection mit dem Namen Feeds ist mit einem ConfigurationPropertyAttribute versehen, das dem Element <feeds/> zugeordnet wird.


Web.config ändern

Wenn der Konfigurationshandler abgeschlossen ist, können Sie die entsprechenden Elemente zu web.config hinzufügen. Der Abschnitt <feedRetriever/> kann an eine beliebige Stelle in der Datei verschoben werden, sofern er direkt vom Stammelement (dem <configuration/> -Element) abstammt. Das Platzieren in einem anderen Konfigurationsabschnitt führt zu einem Fehler.

Der nächste Schritt ist das Hinzufügen eines untergeordneten Elements <section/> zu <configSections />. Das <section/> -Element weist zwei interessante Attribute auf:

  • name - Der Name des Konfigurationsabschnittselements. In diesem Fall lautet der Name feedRetriever.
  • type - Der qualifizierte Name der Klasse, die dem Abschnitt zugeordnet ist, und ggf.
    Der Name der Assembly, in der sich die Klasse befindet. In diesem Fall der qualifizierte Name
    ist FeedRetriever.Configuration.FeedRetrieverSection. Wenn es sich in einem separaten befindet
    Assembly hätte das type-Attribut den Wert "FeedRetriever.Configuration.FeedRetrieverSection,
    <assemblyName>", wobei <assemblyName> der Name der Assembly ist
    ohne die spitzen Klammern.

Das folgende <section/> -Element fügen Sie einer web.config-Datei unter <configSections/> hinzu, wenn sich die Konfigurationsklassen nicht in einer separaten Assembly befinden (wie dies beim Herunterladen des Codes der Fall ist):

Jetzt ist Ihre Anwendung ordnungsgemäß für die Verwendung der Klassen FeedRetrieverSection, FeedElementCollection und FeedElement konfiguriert, um Ihnen programmgesteuerten Zugriff auf die benutzerdefinierten Einstellungen zu gewähren, die im Konfigurationsabschnitt <feedRetriever/> in web.config enthalten sind. Wie greifen Sie über Ihren Code auf diese Einstellungen zu?


Zugriff auf Konfigurationsdaten über Code

Der System.Configuration-Namespace enthält eine statische Klasse namens ConfigurationManager. Wenn Sie den Abschnitt <connectionStrings/> verwenden, um Ihre Verbindungszeichenfolgen zu speichern, sind Sie zumindest mit ConfigurationManager vertraut. Es verfügt über eine Methode namens GetSection(), die eine Zeichenfolge akzeptiert, die den Namen des abzurufenden Konfigurationsabschnitts enthält. Der folgende Code demonstriert dies (vorausgesetzt, die Verwendung von System.Configuration befindet sich oben in der Codedatei):

Die GetSection() -Methode gibt einen Wert vom Typ Object zurück. Daher muss er in den Typ umgewandelt werden, den der Handler für diesen Abschnitt verwendet. Dieser Code ruft den Abschnitt feedRetriever ab und wandelt das Ergebnis in FeedRetrieverSection um. Sobald Sie das Objekt haben, können Sie programmgesteuert auf Konfigurationsdaten zugreifen.

Der folgende Code ist eine sehr grundlegende Implementierung der FeedRetriever-Komponente, um Ihnen eine Vorstellung davon zu geben, wie Konfigurationseinstellungen in Ihrer Komponente oder Anwendung verwendet werden können.

Zunächst wird eine statische Variable namens _Config vom Typ FeedRetreiverSection deklariert und durch Aufrufen von ConfigurationManager.GetSection() ein Wert zugewiesen. Die Variable statisch zu machen, ist eine Entwurfsentscheidung. Auf diese Weise hätten alle Mitglieder der Klasse, entweder instanziell oder statisch, Zugriff auf die Konfigurationseinstellungen, ohne GetSection() mehrfach aufrufen zu müssen.

Sobald Sie den Abschnittshandler mit GetSection() abgerufen haben, haben Sie vollständigen Zugriff auf Objekte, die aus Ihren Handlerklassen erstellt wurden. Die erste Zeile von GetFeeds() ist eine für jede Schleife, die alle FeedElement-Objekte durchläuft, die im FeedElementCollection-Objekt enthalten sind, das von der Feeds-Eigenschaft zurückgegeben wird. Auf diese Weise haben Sie direkten Zugriff auf diese FeedElement-Objekte, sodass Sie problemlos auf die Namen, URLs und Cache-Einstellungen der einzelnen Feeds zugreifen können.

Während jeder Iteration der Schleife stellt die Methode eine Anforderung unter Verwendung der Url-Eigenschaft des FeedElement-Objekts. Wenn die Anforderung erfolgreich ist, werden die Daten des Feeds abgerufen und in der Variablen feedData gespeichert. Anschließend überprüft der Code die Cache-Eigenschaft des FeedElement-Objekts, um festzustellen, ob der Feed zwischengespeichert werden soll oder nicht. Das Zwischenspeichern des Feeds umfasst das Erstellen eines Dateinamens unter Verwendung der Name-Eigenschaft des FeedElement-Objekts sowie des aktuellen Datums und der aktuellen Uhrzeit. Anschließend erstellt ein StreamWriter-Objekt die Datei und schreibt die Daten des Feeds in sie.

Wie Sie sehen können, ist die Verwendung der Handlerklassen für den Konfigurationsabschnitt der Schlüssel zum Abrufen und Verwenden von benutzerdefinierten Einstellungen in web.config. Es erfordert sicherlich mehr Zeit und Mühe von Ihnen, aber es macht es definitiv viel einfacher, Ihre Anwendung oder Komponente für sich und andere Entwickler zu konfigurieren.


Verkaufen Sie Ihre .NET-Komponenten auf CodeCanyon!


CodeCanyon

Wussten Sie, dass wir eine .NET-Kategorie auf CodeCanyon haben? Wenn Sie ein erfahrener .NET-Entwickler sind, verkaufen Sie Ihre scripts/components/controls als Autor und verdienen Sie 40-70% jedes Verkaufs.

  • Folgen Sie uns auf Twitter oder abonnieren Sie den Nettuts+ RSS-Feed, um die besten Webentwicklungs-Tutorials im Web zu erhalten.
Advertisement
Did you find this post useful?
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.