La passeggiata odierna nel framework 2.0 è stata allietata da un bell'incontro: la classe ApplicationSettingsBase. Considero bello l'incontro perchè in questa classe ho ritrovato formalizzato quello che ormai è il mio abituale modo di incapsulare in una classe il file di configurazione dell'applicazione. Sono stato parecchio in giro, per il namespace System.Configuration, alla ricerca delle novità che lo riguardano, per decidere come comportarmi per la configurazione di .TRAQ. Da quello che vedo, le novità non sono poche, ma in gran parte si concentrano attorno a questa classe ed ai SettingsProvider che la supportano.

ApplicationSettingsBase in sostanza consente di esporre come istanza di una classe, una sezione del file di configurazione, trasformandone le chiavi in normali proprietà read/write. Quest'ultima affermazione fa anche comprendere che il framework 2.0 apporta una grossa novità ai file .config, ovvero la possibilità di modificarli a runtime. Ma facciamo un passo alla volta. Ecco una classe che estende ApplicationSettingsBase:

public sealed class DataProviderSettings : ApplicationSettingsBase
{
    
private static DataProviderSettings mInstance = new DataProviderSettings();

    
private DataProviderSettings()
    {}

    
public static DataProviderSettings Current
    {
        
get return mInstance; }
    }

    [ApplicationScopedSetting]
    
public string Type
    {
        
get return (string)this["Type"]; }
        
set this["Type"] = value; }
    }

    [UserScopedSetting]
    [DefaultSettingValue("10")]
    
public System.Int32 PageSize
    {
        
get return (System.Int32)this["PageSize"]; }
        
set this["PageSize"] = value; }
    }
}

In questa classe sono riassunte due delle maggiori novità che ho scovato. Innanzitutto occorre notare gli attributi ApplicationScopedSetting e UserScopedSetting, che rispettivamente consentono di dare un ambito di applicazione e di singolo utente alla proprietà. Questo significa che PageSize in particolare avrà un valore potenzialmente diverso per ogni utente dell'applicazione. La seconda novità, come anticipato poche righe fa è il metodo Save() per mezzo del quale è possibile rendere persistenti le modifiche apportate alle proprietà a runtime. PageSize, potrebbe essere una valida proprietà per memorizzare la dimensione massima di una pagina di record di una applicazione, secondo le preferenze dell'utente.

Ecco infine come deve essere realizzata la parte di configurazione in Xml:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <sectionGroup 
        
name
="applicationSettings" 
        
type
="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
      <section 
          
name
="Elite.DotTraq.ConsoleTest.DataProviderSettings" 
          
type="System.Configuration.ClientSettingsSection, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" /
>
    <
/
sectionGroup>
  <
/
configSections>
  <applicationSettings>
    <Elite.DotTraq.ConsoleTest.DataProviderSettings>
      <setting 
          
name
="Type" 
          
serializeAs
="String">
        <
value>System.Configuration.ClientSettingsSection, System, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value
>
      <
/
setting>  
      <setting 
          
name
="PageSize" 
          
serializeAs
="String">
        <
value>15</value
>
      <
/
setting>  
    <
/
Elite.DotTraq.ConsoleTest.DataProviderSettings>
  <
/
applicationSettings>
<
/
configuration>

L'esplorazione è appena cominciata, infatti ancora non ho avuto occasione di sperimentare l'uso dei SettingsProvider che a quanto ho capito dovrebbero consentire la lettura/scrittura di formati diversi dal consueto xml, e permettere di adottare media più inconsueti, come ad esempio un database. Ecco che in questo caso la proprietà di cui sopra potrebbe essere addirittura letta direttamente dal profilo utente nel database... ancora non so come, ma conto di capirlo a breve.

powered by IMHO