Encapsular sus configuraciones de manera constante es una gran idea.
Lo que hago es crear una clase de configuración, ya sea una clase global estática o varias clases de instancia que luego administraré con inyección de dependencia. Luego cargo todos los ajustes de configuración en esa clase al inicio.
También he escrito una pequeña biblioteca que hace uso de la reflexión para hacer esto aún más fácil.
Una vez que mi configuración esté en mi archivo de configuración
<?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>
Hago una clase estática o de instancia según mis necesidades. Para aplicaciones simples con solo unas pocas configuraciones, una clase estática está bien.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Luego, utilizando mi llamada a la librería ya sea Inflate.Static
o Inflate.Instance
y lo bueno es que puedo usar cualquier fuente de valor clave.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Todo el código para esto está en GitHub en https://github.com/Enexure/Enexure.Fire.Configuration
Incluso hay un paquete nuget:
PM> Install-Package Enexure.Fire.Configuration
Código de referencia:
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 );
}
}
}
}
}
}