Meringkas pengaturan Anda secara konstan adalah ide bagus.
Apa yang saya lakukan adalah membuat kelas pengaturan baik global statis satu atau beberapa kelas instan yang kemudian akan saya kelola dengan injeksi ketergantungan. Lalu saya memuat semua pengaturan dari konfigurasi ke kelas itu saat start up.
Saya juga menulis perpustakaan kecil yang menggunakan refleksi untuk membuatnya lebih mudah.
Setelah pengaturan saya di file konfigurasi saya
<?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>
Saya membuat kelas statis atau instance tergantung pada kebutuhan saya. Untuk aplikasi sederhana dengan hanya beberapa pengaturan, satu kelas statis baik-baik saja.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Kemudian menggunakan panggilan perpustakaan saya baik Inflate.Static
atau Inflate.Instance
dan yang keren adalah saya dapat menggunakan sumber nilai kunci apa pun.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Semua kode untuk ini ada di GitHub di https://github.com/Enexure/Enexure.Fire.Configuration
Bahkan ada paket nuget:
PM> Instal-Paket Enexure.Fire.Configuration
Kode untuk referensi:
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 );
}
}
}
}
}
}