12 May 2009

Vytváření vlastních sekcí ve web.configu

Častým způsobem ukládání nastavení webových aplikací v ASP.NET je ukládání do web.configu. V základu máme možnost přidávat jen elementy do sekce <appSettings>. Takový postup je OK, dokud nám stačí ukládat jen jednoduché věci ve tvaru klíč-hodnota. Kousek XML uchovávající například název stránky může vypadat následovně:

<appSettings>
    <add key="PageTitle" value="Moje stránka" />
</appSettings>
Často taková věc stačí, někdy ale naopak chceme ukládat i složitější věci, teď mě napadají třeba detailní informace k připojení k nějaké vzdálené službě. V takové situaci by se nám určitě víc než X na první pohled nesouvisejících hodnot v <appSettings> hodilo moci uložit takový kód:

<serviceConnection available="true" timeout="00:01:00" url="http://localhost/MyService" />

ASP.NET naštěstí umožňuje rozšiřovat web.config. Dělá se to tak, že pro každý element, který chceme přidat (v našem případě se jmenuje <serviceConnection>), vytvoříme třídu odvozenou od ConfigurationSection, která bude mít sadu public vlastností odpovídajících požadovaným atributům (pro nás tedy atributy “available”, “timeout” a “url”). K tomu navíc musí mít každá z vlastností nad sebou atribut (teď myslím .NETovský atribut, ne ten XML) ConfigurationProperty, který určuje název atributu v XML, to, zda je povinný, a případně jeho výchozí hodnotu. Kód opět řekne víc, než tisíc slov:

public class ServiceConnection : ConfigurationSection
{
    [ConfigurationPorperty("available", IsRequired = false, DefaultValue = true)]
    public bool Available
     {
        get { return (bool)base["available"]; }
        set { base["available"] = value; }
    }

    [ConfigurationPorperty("timeout", IsRequired = true)]
    public TimeSpan Timeout
     {
        get { return (TimeSpan)base["timeout"]; }
        set { base["timeout"] = value; }
    }

    [ConfigurationPorperty("url", IsRequired = true)]
    public string Url
     {
        get { return (string)base["url"]; }
        set { base["url"] = value; }
    }
}

Registrace sekce do web.config

Pro zaregistrování naší nové sekce do web.configu stačí upravit sekci <configSections>. Tento krok je velmi důležitý, protože kdybyste se pokusili přidat do web.configu nezaregistrovanou sekci/element, tak při spuštění aplikace dojde k chybě. Registraci provedete jako v následujícím kódu:

<configSections>
    <section name="serviceConnection" type="ServiceConnection" />
</configSections>

Myslím, že není moc co vysvětlovat – atribut “name” definuje název elementu a atribut "type” odkazuje na naší C# třídu.

A máme hotovo, data z naší nové sekce vytáhneme, jako by to byla jakákoliv standardní sekce, tedy takto:

Configuration config = WebConfigurationManager.OpenWebConfiguration("/");
 ServiceConnection sc = (ServiceConnection)config.GetSection("serviceConnection");
// Hodnotu atributu url získáte pomocí sc.url;