Gestire una propria confiugurazione custom è un esigenza abbastanza comune durante lo sviluppo di applicazioni web.
Con ASP.NET 1.1 si poteva già integrare un propria sezione di configurazione all'interno del web.config implementando l'interfaccia IConfigurationSectionHandler, come mostrato qui.
Con la versione 2.0 il supporto per la customizzazione di configurazioni è stato esteso e reso più semplice e produttivo.
Tramite le classi ConfigurationSection, ConfigurationElement e ConfigurationElementCollection e tramite l'utilizzo dichiarativo di alcuni attributi è possibile implementare le proprie classi di configurazione con uno sforzo minimo, senza preoccuparsi minimamente del processo di serializzazione/deserializzazione su file di configurazione.
Per esempio se volessimo gestire una configurazione di questo tipo nel web.config:
<
myConfigurationSection>
<myConfiguration name="">
</< FONT>myConfiguration>
< FONT></myConfigurationSection>
è sufficiente definire le seguenti classi:
public
sealed class MyConfiguratonSection : ConfigurationSection
public sealed class MyConfiguraton : ConfigurationElement
Ogni ConfigurationElement permette tramite indexer per indice o nome di recupare il valore di ogni proprietà legata all'elemento stesso, sia essa un attributo oppure una sezione figlia.
Quindi nel nostro caso la gestione di myConfiguration sarà implementata in MyConfiguratonSection in questo modo:
[ConfigurationProperty("myConfiguration")]
public MyConfiguration Configuration
{
get
{
return (MyConfiguration )this["myConfiguration"];
}
set
{
this["myConfiguration"] = value;
}
}
Notare l'uso dell'attributo ConfigurationProperty per definire il nome della proprietà nel file xml.
La stessa procedura la si usa per definire gli attributi di una sezione, come nel nostro caso l'attributo name di myConfiguration.
In questo caso nel "getter" il casting sarà fatto sul tipo string.
Leggermente più complicato risulta implementare delle liste.Sempre riprendendo il nostro esempio, se volessimo avere una configurazione di questo tipo:
<myConfigurationSection>
<myConfiguration name="">
<actions>
<action key="" doSomething="" />
<action key="" doSomething="" />
</actions>
</< FONT>myConfiguration>
< FONT></myConfigurationSection>
dovremmo implementare due classi, una per la lista e una per l'elemento della lista:
[ConfigurationCollection(typeof(MyAction))]
public sealed class MyActionCollection : ConfigurationElementCollection
public sealed class MyAction: ConfigurationElement
Da notare anche qui l'uso dell'attributo ConfigurationCollection sulla classe MyActionCollection.
Nella classe MyConfiguraton dovremo definire la collection in questo modo:
[ConfigurationProperty("actions")]
public MyActionCollection Actions
{
get
{
return (MyActionCollection )this["actions"];
}
}
Quando ereditiamo da ConfigurationElementCollection dobbiamo implementare due metodi astratti, il cui nome ne chiarisce l'utilizzo:
protected override ConfigurationElement CreateNewElement()
{
return new MyAction();
}
protected override object GetElementKey(ConfigurationElement element)
{
MyAction action= element as MyAction;
return action.Key; // quella che noi definiamo sia la chiave univoca
}
Per completare l'opera, come nella versione 1.1 di ASP.NET, è necessario registrare nel web.config la nuova sezione di configurazione, specificando il nome della sezione ed il tipo che la implementa:
<
configSections>
<section name="MyConfigurationSection" type="MyNamespace.MyConfigurationSection" />
< FONT></configSections>
Da codice potrò utilizzare i dati della configurazione tramite il ConfigurationManager:
MyConfigurationSection
config = ConfigurationManager.GetSection("MyConfigurationSection") as MyConfigurationSection;