일정한 방식으로 설정을 캡슐화하는 것이 좋습니다.
내가하는 일은 의존성 주입으로 관리 할 하나의 정적 전역 하나 또는 여러 인스턴스 클래스 중 하나를 설정 클래스로 만드는 것입니다. 그런 다음 시작할 때 구성의 모든 설정을 해당 클래스로로드합니다.
나는 또한 이것을 쉽게하기 위해 리플렉션을 사용하는 작은 라이브러리를 작성했습니다.
설정이 구성 파일에 있으면
<?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>
필요에 따라 정적 또는 인스턴스 클래스를 만듭니다. 몇 가지 설정 만있는 간단한 응용 프로그램의 경우 정적 클래스 하나만 있으면됩니다.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
그런 다음 라이브러리 호출을 사용 Inflate.Static
하거나 Inflate.Instance
멋진 것을 사용하면 모든 키 값 소스를 사용할 수 있습니다.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
이에 대한 모든 코드는 https://github.com/Enexure/Enexure.Fire.Configuration의 GitHub에 있습니다.
너겟 패키지도 있습니다.
PM> 설치 패키지 Enexure.Fire. 구성
참조 코드 :
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 );
}
}
}
}
}
}