Se avete provato ad usare i nuovi strumenti per la gestione
della configurazione in .NET 2.0, sicuramente ne sarete rimasti affascinati come
è successo a me, che oramai cerco di usarli ovunque possibile. Vi sarà forse
capitato anche di dover gestire delle configurazioni dinamiche sul tipo di
quelle che adottano i vari provider di ASP.NET. Il MembershipProvider ad esempio
- ma anche tutti gli altri in realtà - tipicamente espongono una serie di
parametri di configurazione che si possono suddividere in parametri "generali",
cioè che si applicano indistintamente a tutti i MembershipProvider e in
parametri "specifici" che invece variano in base a che tipo di provider dobbiamo
configurare. Il SqlMembershipProvider ad esempio richiede una serie di
parametri aggiuntivi - uno per tutti, il nome della stringa di connessione - che
non necessariamente si applicano ad altri tipi di provider. In effetti qualunque
provider deve derivare da ProviderBase che espone un metodo Initialize() tra i
cui argomenti troviamo una NameValueCollection che contiene i parametri
"sconosciuti" che verranno gestiti direttamente dall'implementazione che stiamo
realizzando.
Se vi trovare perciò a dover creare un vostro sistema di
provider, ma anche nel caso in cui vogliate scrivere un sistema pluggabile, in
cui i moduli aggiuntivi possano godere di parametri di configurazione propri
espressi all'interno dell'xml nel web.config dovrete gestire tali parametri in
nel ConfigurationElement che li prevede. Ecco un esempio di come realizzare
questo meccanismo:
public class ApplicationInfo : ConfigurationElement
{
private NameValueCollection attributes = new NameValueCollection();
[ConfigurationProperty("name")]
public string Name
{
get { return (string)this["name"]; }
set { this["name"] = value; }
}
//
// TODO: definire le altre proprietà di default
//
public NameValueCollection Attributes
{
get { return attributes; }
}
protected override bool OnDeserializeUnrecognizedAttribute(string name, string value)
{
attributes.Add(name, value);
return true;
}
}
OnDeserializeUnrecognizedAttribute e il
complementare OnDeserializeUnrecognizedElement sono una coppia di
metodi virtuali che verranno chiamati dal runtime durante la fase di
deserializzazione della configurazione e consentono di gestire eventuali
attributi o elementi imprevisti. Nel caso concreto il metodo
non fa altro che aggiungere i valori ad una NameValueCollection e
ritornare "true" per ogni attributo sconosciuto, informando il
runtime che non se ne deve ulteriormente occupare. Se invece volessimo
gestire una serie specifica di attributi potremmo ritornare
"false" qualora quello trovato non ci competa e in questo caso il
runtime solleverà una eccezione che informa dell'errore di
configurazione.
powered by IMHO 1.3