Encapsuler vos paramètres de manière constante est une excellente idée.
Ce que je fais, c'est créer une classe de paramètres, soit une classe globale statique ou plusieurs classes d'instances que je gérerai ensuite avec l'injection de dépendances. Ensuite, je charge tous les paramètres de configuration dans cette classe au démarrage.
J'ai également écrit une petite bibliothèque qui utilise la réflexion pour rendre cela encore plus facile.
Une fois mes paramètres dans mon fichier de configuration
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="Domain" value="example.com" />
<add key="PagingSize" value="30" />
<add key="Invalid.C#.Identifier" value="test" />
</appSettings>
</configuration>
Je crée une classe statique ou d'instance en fonction de mes besoins. Pour les applications simples avec seulement quelques paramètres, une classe statique convient.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Ensuite, en utilisant mon appel de bibliothèque soit Inflate.Static
ou, Inflate.Instance
et la chose intéressante est que je peux utiliser n'importe quelle source de valeur clé.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Tout le code pour cela est dans GitHub à https://github.com/Enexure/Enexure.Fire.Configuration
Il y a même un paquet nuget:
PM> Install-Package Enexure.Fire.Configuration
Code de référence:
using System;
using System.Linq;
using System.Reflection;
using Fire.Extensions;
namespace Fire.Configuration
{
public static class Inflate
{
public static void Static( Type type, Func<string, string> dictionary )
{
Fill( null, type, dictionary );
}
public static void Instance( object instance, Func<string, string> dictionary )
{
Fill( instance, instance.GetType(), dictionary );
}
private static void Fill( object instance, Type type, Func<string, string> dictionary )
{
PropertyInfo[] properties;
if (instance == null) {
// Static
properties = type.GetProperties( BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly );
} else {
// Instance
properties = type.GetProperties( BindingFlags.Public | BindingFlags.Instance | BindingFlags.DeclaredOnly );
}
// Get app settings and convert
foreach (PropertyInfo property in properties) {
var attributes = property.GetCustomAttributes( true );
if (!attributes.Any( x => x is Ignore )) {
var named = attributes.FirstOrDefault( x => x is Named ) as Named;
var value = dictionary((named != null)? named.Name : property.Name);
object result;
if (ExtendConversion.ConvertTo(value, property.PropertyType, out result)) {
property.SetValue( instance, result, null );
}
}
}
}
}
}