2 votes

Comment charger la configuration au démarrage de l'application ?

J'ai créé un fichier de configuration App.config contenant tous les paramètres de fonctionnement relatifs à mon application.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <add key="MinConnectionCount" value="2"/>
    <add key="MaxConnectionCount" value="7"/>
  </appSettings>
</configuration>

Pour lire ces valeurs et les rendre disponibles à l'ensemble de l'application, il suffit d'utiliser la fonction AppSettings de l ConfigurationManager comme suit :

try
{
    NameValueCollection myAppSettings = ConfigurationManager.AppSettings;

    byte min = byte.Parse(myAppSettings["MinConnectionCount"]);
    byte max = byte.Parse(myAppSettings["MaxConnectionCount"]);
}
catch (ConfigurationErrorsException e)
{
    throw e;
}

Les valeurs lues par le AppSettings sont de type chaîne de caractères, vous devez donc effectuer les conversions et les contrôles nécessaires :

  • Vous devez effectuer les conversions appropriées, en vous assurant qu'il n'y a pas d'erreurs d'analyse. Il peut être utile de vérifier que les valeurs obtenues par la conversion sont cohérentes avec le domaine d'application : par exemple, le nombre minimum de connexions doit être inférieur au nombre maximum.
  • Tout ce qui implique le chargement de la configuration doit être fait au démarrage de l'application, car les paramètres chargés pourraient être utilisés pour allouer des structures de données telles que des tables, des files d'attente, etc. S'il devait y avoir des erreurs lors du chargement de la configuration, l'application devrait utiliser une configuration par défaut : les erreurs peuvent être signalées par une alerte.
  • Enfin, la configuration doit être en lecture seule, ce qui signifie qu'elle ne doit pas être modifiée pendant l'exécution de l'application. Cela simplifie également l'accès par plusieurs threads.

Afin d'atteindre ces objectifs, j'ai créé une classe qui charge la configuration à partir du fichier et rend disponible, via la propriété appropriée, les paramètres convertis.

public class MyConfiguration
{
    enum Errors
    {
        CONNECTION_RANGES_ERROR
        // some other errors
    }

    private byte m_MinConnectionCount;
    private byte m_MaxConnectionCount;

    private readonly List<Errors> m_ConfigErrors = new List<Errors>();

    public MyConfiguration()
    {
        try
        {
            NameValueCollection appSettings = ConfigurationManager.AppSettings;

            if (!SetConnectionRanges(appSettings["MinConnectionCount"], appSettings["MaxConnectionCount"]))
                m_ConfigErrors.Add(Errors.CONNECTION_RANGES_ERROR);

            // ...
        }
        catch (ConfigurationErrorsException e)
        {
            throw e;
        }
    }

    private bool SetConnectionRanges(string minCountStr, string maxCountStr)
    {
        if (byte.TryParse(minCountStr, out m_MinConnectionCount)
            && m_MinConnectionCount > 0
            && byte.TryParse(maxCountStr, out m_MaxConnectionCount)
            && m_MaxConnectionCount > m_MinConnectionCount)
            return true;

        m_MinConnectionCount = 2;
        m_MaxConnectionCount = 7;
        return false;
    }

    public byte MinConnectionCount { get { return m_MinConnectionCount; } }

    public byte MaxConnectionCount { get { return m_MaxConnectionCount; } }

    public List<Errors> GetErrors() { return m_ConfigErrors; }
}

El GetErrors() permet d'obtenir une liste des erreurs survenues lors du chargement des paramètres de configuration : l'utilisateur peut être informé de ces erreurs, et peut être informé que l'application a utilisé les valeurs par défaut pour les paramètres.

  1. Comment s'assurer que cette classe est instanciée en premier lors du démarrage de l'application ?
  2. Je pourrais appliquer le modèle de singleton à cette classe : de cette façon, je devrais juste invoquer un Instance en tant que première déclaration de la Main méthode. Mais où dois-je invoquer la méthode Instance dans une application WPF ?
  3. Plutôt que d'utiliser le modèle singleton, je pourrais créer une variable globale pour MyConfiguration et invoquer la classe GetErrors() comme première déclaration de la méthode Main méthode. Mais où dois-je invoquer la méthode GetErrors() dans une application WPF ?

1voto

Alex Points 10289

Changez votre classe pour qu'elle soit static pour en assurer une seule instance.

Vous pouvez alors invoquer MyConfiguration.GetErrors() en el Load du premier formulaire que vous affichez et signalez les erreurs.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X