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