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


per leggere il post originale o inviare un commento visita il seguente indirizzo: ASP.NET 2.0: Leggere gli attributi sconosciuti da un ConfigurationElement