Kolumne: Dino talks

Benutzerdefinierte Abschnitte in .NET-Konfigurationsdateien
Kommentare

Das .NET Framework definiert ein maßgeschneidertes, XML-basiertes API, um auf Konfigurationsdateien zuzugreifen. Der Entwickler wird dadurch gezwungen, sich an ein allgemeines, umfangreiches und vordefiniertes Schema zum Speichern von Anwendungseinstellungen zu halten. Das Standardschema und die Standardelemente sind in den meisten Fällen geeignet, doch zweifellos nicht immer. Deshalb müssen Sie manchmal das Standardschema durch benutzerdefinierte Abschnitte erweitern. Um einen benutzerdefinierten Abschnitt zu erstellen, ist es erforderlich, eine oder mehrere Klassen anzulegen, die von bestimmten Systemklassen erben.

In .NET ist das vordefinierte XML-Schema für Konfigurationsdateien meistens das richtige, doch wenn Sie komplexe und strukturierte Informationen dauerhaft speichern müssen, scheint keiner der vorhandenen Abschnitte genügend leistungsfähig zu sein. Hier gibt es nun zwei mögliche Workarounds. Beim ersten Ansatz schreiben Sie eine benutzerdefinierte XML-Datei basierend auf dem Schema, das Ihnen für die Daten am zweckmäßigsten erscheint. In diesem Fall verzichten Sie einfach auf die standardmäßige .NET-Konfigurationsdatei. Bei der zweiten Option betten Sie Ihre XML-Konfigurationsdaten in die Standardanwendungs-Konfigurationsdatei ein, stellen aber einen maßgeschneiderten Handler zum Lesen des Konfigurationsabschnitts bereit.

Möchten Sie einen neuen Abschnitt (und eine optionale neue Abschnittsgruppe) erstellen, müssen Sie die Konfigurationsdatei (web.config oder app.config) bearbeiten, um den neuen Abschnitt oder die neue Abschnittsgruppe zu registrieren. Während der Registrierung des neuen Abschnitts müssen Sie die Abschnitts-Handler-Komponente spezifizieren – d. h. die Softwarekomponente, die den Inhalt des Abschnitts nach verarbeitbaren Daten parsen soll. Je nach Art der Daten, die Sie im Abschnitt speichern möchten, können Sie auf die vorhandenen Handler zurückgreifen oder – was wahrscheinlicher ist – einen eigenen Abschnitts-Handler erstellen.

Einen Handler für den Konfigurationsabschnitt schreiben

Der Konfigurationsabschnitts-Handler ist eine Klasse, die letztlich von der Basisklasse ConfigurationSection abgeleitet ist. In der Regel ist die Klasse für den Abschnitts-Handler eine recht einfache Klasse, die lediglich einen Stapel von öffentlichen Eigenschaften definiert. Jede Eigenschaft wird dann einem Attribut im XML-Konfigurationsabschnitt zugeordnet. Die Zuordnung erfolgt über ein spezielles Attribut, das mit den Eigenschaften verknüpft ist – und zwar das Attribut ConfigurationProperty. Das Beispiel in Listing 1 zeigt, wie Sie den Handler für einen neuen Abschnitt erstellen.

Listing 1

public class MyPagesSection : ConfigurationSection 
{
   private static readonly ConfigurationProperty propPageBackColor = null;

   static MyPagesSection()
   {
      MyPagesSection.propPageBackColor = new ConfigurationProperty(
         "PageBackColor", typeof(String), "yellow", 
          ConfigurationPropertyOptions.IsRequired);
   }

   [ConfigurationProperty("pageBackColor")]
   public String PageBackColor
   {
       get { return (String) base[MyPagesSection.propPageBackColor]; }
       set { base[MyPagesSection.propPageBackColor] = value; }
   }
}  

Der Abschnitt definiert ein Attribut namens pageBackColor. Das XML-Attribut wird auf die Eigenschaft PageBackColor der Klasse abgebildet. Im Einzelnen wird die Zuordnung zwischen einer Eigenschaft und einem Abschnittsattribut über das Attribut ConfigurationProperty eingerichtet. Der Parameter im Konstruktor des Attributs gibt den Namen des Abschnittsattributs an, mit dem die Eigenschaft zu versehen ist. Der Eigenschaft können Sie mithilfe der Eigenschaft DefaultValue im Attribut einen Standardwert zuweisen (Listing 2).

Listing 2

[ConfigurationProperty("pageBackColor", DefaultValue="blue")]
   public String PageBackColor
{
    get { return (String) base[MyPagesSection.propPageBackColor]; }
    set { base[MyPagesSection.propPageBackColor] = value; }
}  

Des Weiteren können Sie die Eigenschaft IsRequired festlegen, die einen booleschen Wert übernimmt, und anzeigt, ob das Attribut im Abschnittsschema erforderlich ist oder nicht.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -