การห่อหุ้มการตั้งค่าของคุณในลักษณะที่คงที่เป็นความคิดที่ดี
สิ่งที่ฉันทำคือสร้างคลาสการตั้งค่าไม่ว่าจะเป็นคลาสสแตติกโกลบอลหนึ่งหรือหลายอินสแตนซ์ซึ่งฉันจะจัดการด้วยการฉีดพึ่งพา จากนั้นฉันโหลดการตั้งค่าทั้งหมดจากการกำหนดค่าลงในคลาสนั้นเมื่อเริ่มต้น
ฉันยังเขียนห้องสมุดเล็ก ๆ ที่ใช้การสะท้อนเพื่อทำให้ง่ายยิ่งขึ้น
เมื่อการตั้งค่าของฉันอยู่ในไฟล์กำหนดค่าของฉัน
<?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] );
รหัสทั้งหมดนี้อยู่ใน GitHub ที่https://github.com/Enexure/Enexure.Fire.Configuration
มีแม้กระทั่งแพ็คเกจ nuget:
PM> Install-Package Enexure.Fire.Configuration
รหัสสำหรับการอ้างอิง:
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 );
}
}
}
}
}
}