Ayarlarınızı sabit bir şekilde kapsüllemek harika bir fikirdir.
Ne bir bağımlılık enjeksiyon ile yöneteceğim bir statik küresel bir veya birden çok örnek sınıfları bir ayarlar sınıfı oluşturmaktır. Sonra başlangıçta yapılandırmadan tüm ayarları bu sınıfa yüklerim.
Ayrıca bunu daha da kolaylaştırmak için yansımayı kullanan küçük bir kütüphane yazdım.
Ayarlarım yapılandırma dosyamda olduğunda
<?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>
Benim ihtiyaçlarına bağlı olarak bir statik veya örnek sınıf yapmak. Sadece birkaç ayara sahip basit uygulamalar için bir statik sınıf iyidir.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Sonra benim kütüphane çağrısı ya Inflate.Static
ya Inflate.Instance
ve serin şey kullanarak herhangi bir anahtar değeri kaynağı kullanabilirsiniz.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Bunun için tüm kod GitHub'da https://github.com/Enexure/Enexure.Fire.Configuration adresinde bulunmaktadır.
Bir nuget paketi bile var:
PM> Install-Package Enexure.Fire.Configuration
Referans kodu:
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 );
}
}
}
}
}
}