Đóng gói các thiết lập của bạn một cách liên tục là một ý tưởng tuyệt vời.
Những gì tôi làm là tạo một lớp cài đặt hoặc một lớp toàn cầu tĩnh hoặc nhiều lớp đối tượng mà sau đó tôi sẽ quản lý bằng phép nội xạ phụ thuộc. Sau đó, tôi tải tất cả các cài đặt từ cấu hình vào lớp đó khi khởi động.
Tôi cũng đã viết một thư viện nhỏ sử dụng sự phản chiếu để làm cho việc này trở nên dễ dàng hơn.
Khi cài đặt của tôi nằm trong tệp cấu hình của tôi
<?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>
Tôi tạo một lớp tĩnh hoặc cá thể tùy thuộc vào nhu cầu của tôi. Đối với các ứng dụng đơn giản chỉ có một vài cài đặt, một lớp tĩnh là ổn.
private static class Settings
{
public string Domain { get; set; }
public int PagingSize { get; set; }
[Named("Invalid.C#.Identifier")]
public string ICID { get; set; }
}
Sau đó, sử dụng thư viện của tôi gọi một trong hai Inflate.Static
hoặc Inflate.Instance
điều thú vị là tôi có thể sử dụng bất kỳ nguồn giá trị quan trọng nào.
using Fire.Configuration;
Inflate.Static( typeof(Settings), x => ConfigurationManager.AppSettings[x] );
Tất cả mã cho điều này là trong GitHub tại https://github.com/Enexure/Enexure.Fire.Configuration
Thậm chí còn có một gói nuget:
PM> Cài đặt-Gói Enexure.Fire.Configuration
Mã để tham khảo:
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 );
}
}
}
}
}
}