.NET aplikace jsou předurčeny k tomu, aby své konfigurační údaje ukládaly do souboru jménoaplikace.config (v případě webových web.config). K takto uloženým údajům lze přistupovat pomocí namespace System.Configuration.ConfigurationSettings.

Konfigurační soubory jsou psány ve formátu XML a jsou rozděleny na několik sekcí. Web.Config typické webové aplikace vypadá nějak takhle:

<configuration>
  <appSettings>
    <add key="Nazev1" value="hodnota1" />
    <add key="Nazev2" value="hodnota2" />
  <appSettings>
  <system.web>
    <authentication mode="Forms">
      <forms name=".CHEETAH3AUTH" loginUrl="/Login.aspx" protection="All" timeout="60"/>
    </authentication>
  </system.web>
</configuration>

Aplikační nastavení se obvykle ukládají do sekce appSettings jako dvojice název-hodnota. Přistupovat k nim pak lze jako k hodnotám kolekce System.Configuration.ConfigurationSettings.AppSettings.

Za hranice AppSettings

Výše uvedený postup stačí pro jednoduché aplikace. Ale pokud píšete aplikaci složitější, pravděpodobně oceníte možnost zapsat její konfiguraci pomocí vlastních XML elementů a atributů. Protože jenom málo věcí je v prostředí .NET "zadrátováno" napevno, máte možnost snadno si naprogramovat vlastní konfigurační sekci.

Princip je zhruba následující: Je třeba vytvořit dvě třídy. Jedna bude reprezentovat vlastní nastavení (její vlastnosti a metody budou mít hodnoty podle uživatelem definovaného obsahu konfiguračního souboru). Druhá třída bude tzv. configuration section handler a zajistí naplnění konfigurační sekce dle potřeby.

Představme si, že chcete do konfiguračního souboru vložit novou sekci, která bude obsahovat informace pro odesílání e-mailových zpráv. Ona sekce bude vypadat nějak takhle:

<mailConfig>
  <from name="Jméno odesílatele" address="[email protected]" />
  <to name="Jméno příjemce" address="[email protected]" />
  <smtpServer>localhost</smtpServer>
</mailConfig>

Obslužný kód ve VB.NET sestává ze dvou tříd:

Public Class EmailSettingsConfigHandler
    Implements System.Configuration.IConfigurationSectionHandler

    Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
        Return New EmailSettings(section)
    End Function
End Class

Public Class EmailSettings
    Private _From, _To, _SmtpServer As String

    Friend Sub New(ByVal E As System.Xml.XmlNode)
        Me._From = """" & E.SelectSingleNode("from/@name").Value & """ " & _
                   "<" & E.SelectSingleNode("from/@address").Value & ">"
        Me._To = """" & E.SelectSingleNode("to/@name").Value & """ " & _
                   "<" & E.SelectSingleNode("to/@address").Value & ">"
        Me._SmtpServer = E.SelectSingleNode("smtpServer").InnerText
    End Sub

    Public ReadOnly Property From() As String
        Get
            Return Me._From
        End Get
    End Property

    Public ReadOnly Property [To]() As String
        Get
            Return Me._To
        End Get
    End Property

    Public ReadOnly Property SmtpServer() As String
        Get
            Return Me._SmtpServer
        End Get
    End Property
End Class

Třída EmailSettings reprezentuje vlastní nastavení, která načítá ve svém konstruktoru z XML dokumentu.

Třída EmailSettingsConfigHandler slouží systému k práci s novou konfigurační sekcí. Implementuje rozhraní IConfigurationSectionHandler, které definuje jedinou metodu: Create. Jejím jediným parametrem, který nás momentálně zajímá, je section. To je XmlNode, odkazující na přiřazenou konfigurační sekci, v našem případě tedy na element <mailConfig>. Metoda vrací instanci námi vytvořené třídy s nastaveními a je velmi jednoduchá, veškerou "špinavou práci" za nás odvede konstruktor třídy samé.

Konfigurace konfigurátoru

Abychom mohli nově založenou konfigurační sekci využívat, je potřeba ji zaregistrovat. To se dělá přidáním elementu configSections, jehož obsah je následující:

<configSections>
  <section name="mailConfig" type="AltairCommunications.Test.EmailSettingsConfigHandler, Test" />
</configSections>

Atribut section/@name určuje název elementu konfigurační sekce. Atribut section/@type je úplné označení typu výše uvedené třídy EmailSettingsConfigHandler. Konkrétní hodnota tohoto atributu záleží na vašem nastavení. Moje třída je uložena v namespace AltairCommunications.Test, vaše se bude patrně jmenovat jinak. Parametr za čárkou je název assembly (bez přípony, např. .dll), ve které se typ nachází. Moje knihovna se tedy jmenuje Test.dll - vaše se opět bude zřejmě jmenovat jinak.

Použití konfigurace

Použití konfigurace je jednoduché. Zavoláte System.Configuration.ConfigurationSettings.GetConfig("název sekce") a přetypujete na váš konfigurační typ. Například:

Public Sub SendMail()
    Dim Config As EmailSettings = DirectCast(System.Configuration.ConfigurationSettings.GetConfig("mailConfig"), EmailSettings)
    Dim Msg As New System.Web.Mail.MailMessage
    Msg.From = Config.From
    Msg.To = Config.To
    Msg.Subject = "Testovací zpráva"
    Msg.Body = "Obsah testovací zprávy"

    System.Web.Mail.SmtpMail.SmtpServer = Config.SmtpServer
    System.Web.Mail.SmtpMail.Send(Msg)
End Sub