Incapsulare le impostazioni in modo costante è un'ottima idea.
Quello che faccio è creare una classe di impostazioni una globale statica o più classi di istanza che gestirò con l'iniezione di dipendenza. Quindi carico tutte le impostazioni dalla configurazione in quella classe all'avvio.
Ho anche scritto una piccola biblioteca che utilizza la riflessione per renderlo ancora più semplice.
Una volta che le mie impostazioni sono nel mio file di configurazione
<?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>
Faccio una classe statica o di istanza a seconda delle mie esigenze. Per applicazioni semplici con poche impostazioni, una classe statica va bene.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Quindi usando la mia chiamata in libreria o Inflate.Static
o Inflate.Instance
e il bello è che posso usare qualsiasi fonte di valore chiave.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Tutto il codice per questo è in GitHub all'indirizzo https://github.com/Enexure/Enexure.Fire.Configuration
C'è anche un pacchetto nuget:
PM> Install-Package Enexure.Fire.Configuration
Codice di riferimento:
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 );
}
}
}
}
}
}