Es ist eine großartige Idee, Ihre Einstellungen konstant zu kapseln.
Ich erstelle eine Einstellungsklasse, entweder eine statische globale eine oder mehrere Instanzklassen, die ich dann mit der Abhängigkeitsinjektion verwalten werde. Dann lade ich beim Start alle Einstellungen aus der Konfiguration in diese Klasse.
Ich habe auch eine kleine Bibliothek geschrieben, die Reflexion nutzt, um dies noch einfacher zu machen.
Sobald meine Einstellungen in meiner Konfigurationsdatei sind
<?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>
Ich erstelle je nach Bedarf eine statische oder Instanzklasse. Für einfache Anwendungen mit nur wenigen Einstellungen ist eine statische Klasse in Ordnung.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Dann benutze ich entweder meinen Bibliotheksaufruf Inflate.Static
oder Inflate.Instance
und das Coole ist, dass ich jede Schlüsselwertquelle verwenden kann.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Der gesamte Code hierfür befindet sich in GitHub unter https://github.com/Enexure/Enexure.Fire.Configuration
Es gibt sogar ein Nuget-Paket:
PM> Install-Package Enexure.Fire.Configuration
Code als Referenz:
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 );
}
}
}
}
}
}