Nella versione 1.0 e 1.1 del .NET Framework per realizzare un gestore di sezione di configurazione personalizzato è necessario creare una classe che direttamente o indirettamente implementi l'interfaccia IConfigurationSectionHandler.
Con la release 2 questo metodo viene deprecato in favore dell'uso di una classe che derivi da ConfigurationSection (System.Configuration).
Per creare una sezione di configurazione personalizzata abbiamo a disposizione due modelli di sviluppo:
- programmatico: consiste nel definire per ogni attributo della sezione di configurazione un'istanza della classe ConfigurationProperty aggiungerla alla collezione ConfigurationPropertyCollection e creare una proprietà pubblica per impostare o ottenere il suo valore;
- dichiarativo: permette di creare gli attributi della sezione di configurazione semplicemente decorando la rispettiva proprietà.
Se scegliamo quest'ultima strada, ci sono due tipi di attributi con cui decorare la tale proprietà:
- ConfigurationCollectionAttribute
- ConfigurationPropertyAttribute
In questo script ci occuperemo del modello dichiarativo con ConfigurationProperty e del rispettivo modello programmatico.
Creiamo due nuove classi che ereditano da CustomSection, così:
namespace CustomSection { public class DeclarativeModel : ConfigurationSection { [ConfigurationProperty("name", DefaultValue="marco", IsRequired=false)] public string Name { get { return (string)this["name"]; } set { this["name"] = value; } } } public class ProgrammaticModel : ConfigurationSection { private static ConfigurationProperty name = new ConfigurationProperty("name", typeof(string)); public ProgrammaticModel() { Properties.Add(name); } public string Name { get { return (string)this["name"]; } set { this["name"] = value; } } } }
Nella classe DeclarativeModel adottiamo il modello dichiarativo, definiamo una proprietà Name di tipo stringa e la decoriamo con l'attributo ConfigurationProperty. Sarà ASP.NET tramite Reflection a eseguire tutte le operazioni necessarie alla corretta inizializzazione della classe.
La classe ProgrammaticModel adotta il modello programmatico, con un campo statico name del tipo ConfigurationProperty, aggiunto alla collezione ConfigurationPropertyCollection esposta tramite la proprietà Properties ereditata dalla classe base, direttamente nel costruttore. In questo caso esponiamo una proprietà pubblica per impostare/ottenre il valore.
Non ci rimane che compilare il tutto nell'assembly AssemblySection e aggiungere nel web.config le seguenti righe di configurazione:
<configSections> <sectionGroup name="Modelli.Di.Sviluppo"> <section name="DeclarativeCustomSection" type="CustomSection.DeclarativeModel, AssemblySection" allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true" /> <section name="ProgrammaticCustomSection" type="CustomSection.ProgrammaticModel, AssemblySection " allowDefinition="Everywhere" allowExeDefinition="MachineToApplication" restartOnExternalChanges="true" /> </sectionGroup> </configSections> <Modelli.Di.Sviluppo> <DeclarativeCustomSection name="dichiarativo" /> <ProgrammaticCustomSection name="programmatico" /> </Modelli.Di.Sviluppo>
Infine per recuperare le impostazioni definite nella sezioni di configurazione personalizzate, possiamo usare il metodo statico GetSection esposto dalla classe ConfigurationManager, così:
CustomSection.DeclarativeModel configD = (CustomSection.DeclarativeModel)ConfigurationManager.GetSection("Modelli.Di.Sviluppo/DeclarativeCustomSection"); Response.Write(configD.Name); CustomSection.ProgrammaticModel configP = (CustomSection.ProgrammaticModel)ConfigurationManager.GetSection("Modelli.Di.Sviluppo/ProgrammaticCustomSection"); Response.Write(configP.Name);
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.