File di configurazione XML per applicazioni .NET Micro Framework (Italiano)

Tutte le applicazioni necessitano di file di configurazione: li utilizziamo per personalizzare il loro comportamento e per impostare parametri non noti in fase di compilazione, o che possono cambiare nel tempo (come la stringa di connessione al database, l’indirizzo del server di posta elettronica, ecc.).

.NET fornisce la classe ConfigurationManager (o WebConfigurationManager, nel caso di applicazioni web) per recuperare i parametri di configurazione memorizzati all’interno dei file .CONFIG. Questa classe, tuttavia, non è inclusa nel .NET Micro Framework.

Possiamo però creare una versione ridotta del ConfigurationManager per il .NET Micro Framework in grado di leggere la sezione appSettings dei file di configurazione standard di .NET, dal momento che si tratta di semplici file XML.

public static class ConfigurationManager
{
    private const string APPSETTINGS_SECTION = "appSettings";
    private const string ADD = "add";
    private const string KEY = "key";
    private const string VALUE = "value";

    private static Hashtable appSettings;

    static ConfigurationManager()
    {
        appSettings = new Hashtable();
    }

    public static string GetAppSetting(string key)
    {
        return GetAppSetting(key, null);
    }

    public static string GetAppSetting(string key, string defaultValue)
    {
        if (!appSettings.Contains(key))
            return defaultValue;

        return (string)appSettings[key];
    }

    public static void Load(Stream xmlStream)
    {
        using (XmlReader reader = XmlReader.Create(xmlStream))
        {
            while (reader.Read())
            {
                switch (reader.Name)
                {
                    case APPSETTINGS_SECTION:
                        while (reader.Read())
                        {
                            if (reader.Name == APPSETTINGS_SECTION)
                                break;

                            if (reader.Name == ADD)
                            {
                                var key = reader.GetAttribute(KEY);
                                var value = reader.GetAttribute(VALUE);

                                //Debug.Print(key + "=" + value);
                                appSettings.Add(key, value);
                            }
                        }

                        break;
                }
            }
        }
    }
}

Il metodo più importante della classe è  Load, che prende in ingresso uno Stream contenente il file di configurazione e lo legge con un XmlReader, alla ricerca del tag appSettings. Quando lo trova, cicla su tutti gli elementi con nome add e, per ognuno, estrae i valori degli attributi key e value, salvandoli nell’Hashtable appSettings. Abbiamo poi la funzione GetAppSettings, che restituisce il valore corrispondente alla chiave specificata; di essa c’è anche un overload che restituisce un valore di default se la chiave non esiste.

Passiamo ad un esempio del suo utilizzo. Creiamo una nuova applicazione Gadgeteer collegando il modulo SD Card alla scheda FEZ Spider.  Abbiamo quindi bisogno di una scheda SD, nella cui root memorizziamo il seguente file di configurazione, nel formato standard di .NET, attribuendogli il nome Application.config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSetting>
    <add key="Key1" value="Value1" />
    <add key="Key2" value="Value2" />
    <add key="Key3" value="Value3" />
    <add key="hostName" value="www.google.it" />
    <add key="port" value="25" />
  </appSettings>
</configuration>

Infine, nel file Program.cs leggiamo il file dalla scheda di memoria e lo passiamo al ConfigurationManager:

using System;
using Microsoft.SPOT;
using Microsoft.SPOT.Presentation;
using Microsoft.SPOT.Presentation.Controls;
using Microsoft.SPOT.Presentation.Media;

using GT = Gadgeteer;
using GTM = Gadgeteer.Modules;
using System.IO;
using Gadgeteer.Modules.GHIElectronics;

namespace AppSettingsExample
{
    public partial class Program
    {
        void ProgramStarted()
        {
            sdCard.SDCardMounted += new SDCard.SDCardMountedEventHandler(sdCard_SDCardMounted);

            Debug.Print("Program Started");
        }

        private void sdCard_SDCardMounted(SDCard sender, GT.StorageDevice SDCard)
        {
            // Read configuration file.
            string filePath = "Application.config";
            using (Stream configStream = SDCard.OpenRead(filePath))
            {
                // Load settings.
                ConfigurationManager.Load(configStream);
            }

            // Retrieve some values.
            var host = ConfigurationManager.GetAppSetting("hostName");
            var port = ConfigurationManager.GetAppSetting("port");
            var userName = ConfigurationManager.GetAppSetting("userName", "anonymous");

            Debug.Print("HostName: " + host);
            Debug.Print("Port: " + port);
            Debug.Print("Username: " + userName);
        }
    }
}

L’evento sdCard_SDCardMounted viene generato quando la memoria inserita nel modulo è pronta per l’utilizzo. Leggiamo il file di nome Application.config tramite il metodo OpenRead e lo passiamo al metodo ConfigurationManager.Load. A questo punto, recuperiamo alcuni valori di esempio tramite chiamate a GetAppSetting e li stampiamo nella finestra di Output di Visual Studio. Notiamo che nel terzo caso richiediamo il valore della chiave userName, che non è presente nel file di configurazione, quindi ci viene restituito il valore di default specificato (ovvero anonymous).

Il codice della classe ConfigurationManager può essere facilmente esteso per supportare nuove sezioni all’interno del file di configurazione, aggiungendo rami allo switch del metodo Load.

L’applicazione di esempio è disponibile per il download.

AppSettingsExample.zip

,

  1. Leave a comment

Leave a comment