Encapsular suas configurações de maneira constante é uma ótima idéia.
O que faço é criar uma classe de configurações, uma global estática, uma ou várias instâncias, que gerenciarei com injeção de dependência. Em seguida, carrego todas as definições de configuração nessa classe na inicialização.
Também escrevi uma pequena biblioteca que faz uso da reflexão para tornar isso ainda mais fácil.
Quando minhas configurações estiverem no meu arquivo de configuração
<?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>
Eu faço uma classe estática ou de instância, dependendo das minhas necessidades. Para aplicativos simples com apenas algumas configurações, uma classe estática é boa.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Então, usando minha chamada de biblioteca ou Inflate.Staticou, Inflate.Instanceo interessante é que posso usar qualquer fonte de valor-chave.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Todo o código para isso está no GitHub em https://github.com/Enexure/Enexure.Fire.Configuration
Existe até um pacote de pepitas:
PM> Enexure.Fire.Configuration do pacote de instalação
Código de referência:
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 );
}
}
}
}
}
}