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.
- Comment s'assurer que cette classe est instanciée en premier lors du démarrage de l'application ?
- 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 laMain
méthode. Mais où dois-je invoquer la méthodeInstance
dans une application WPF ? - Plutôt que d'utiliser le modèle singleton, je pourrais créer une variable globale pour
MyConfiguration
et invoquer la classeGetErrors()
comme première déclaration de la méthodeMain
méthode. Mais où dois-je invoquer la méthodeGetErrors()
dans une application WPF ?