Ogni applicazione ha un set di informazioni che è comodo vengano rese "configurabili" esternamente, ad esempio la classica stringa di connessione ad un database o il set di items da visualizzare in una determinata area del nostro programma.
Di fronte ad una necessità di questo tipo la risposta è: Usare il file .config e la relativa classe ConfigurationSettings la quale ci permette di accedere agevolmente a tale informazioni.
Quando le informazioni vanno oltre però la classica configurazione "Nome=Valore" le cose si complicano leggermente, ad esempio mi sono trovato a dovere memorizzare una serie di items che verranno successivamente mappati su istanze di una classe Category la quale espone 3 proprietà: Name,StartColor e TextColor e la scelta obbligata è stata quella di usare IConfigurationSectionHandler.
Questo il file .config della mia applicazione:
xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="Categories" type="MyApp.Categories,MyApp" />
< FONT>configSections>
<Categories>
<Category name="Cool" startColor="yellow" textColor="blue" />
<Category name="Heat" startColor="red" textColor="#00FF00" />
< FONT>Categories>
< FONT>configuration>
Come potete vedere ho definito in una nuova sezione che ho chiamato Categories e successivamente ho definito il contenuto della stessa con gli elementi che voglio memorizzare, da notare l'attributo type che indica quale classe gestirà il contenuto dell'elemento Categories nella forma "RootNamespace.ClassName,Assembly".
Fatto questo nel mio programma MyApp ho definito questa classe
public class Categories:CollectionBase,IConfigurationSectionHandler
{
public Categories():base(){}
public object Create(object parent, object configContext, XmlNode section)
{
XmlNodeList list=section.SelectNodes("Category");
foreach(XmlNode node in list)
{
Category category=new Category(node.Attributes["startColor"].Value,
node.Attributes["startColor"].Value,
node.Attributes["name"].Value);
base.InnerList.Add(category);
}
return this;
}
}
La classe Categories implementa l'interfaccia System.ComponentModel.IConfigurationSectionHandler la quale ha un solo metodo Create che riceve in ingresso tra i vari parametri il nodo XML relativo all'elemento Categories che quindi possiamo gestire nella maniera più opportuna (nel mio caso creo delle istanze dell'oggetto Category inizializzato con le info prese dal file .config)
Nel framework sono già definite alcune classi che implementano IConfigurationSectionHandler: DictionarySectionHandler, IgnoreSectionHandler
NameValueSectionHandler e SingleTagSectionHandler che permettono di gestire differentemente le info contenute nel file .config (in MSDN trovate tutti i dettagli del caso)
Per utilizzare la classe basta inserire questa riga:
Categories cat=(Categories)ConfigurationSettings.GetConfig("Categories");
Per ottenere la collezione Categories valorizzata con i valori presi direttamente dal file .config.