我正在研究簡化應用程序配置的庫。本質上,庫的使用者可以用屬性裝飾他們的配置類,或者用代碼聲明性地初始化這些設置。可以指定一個或多個來源來讀取/寫入配置屬性(訪問器)或從類繼承默認值。例如,以下內容:包含屬性中類型的庫中DI的最佳實踐
[ConfigurationNamespace(DefaultAccessors = new Type[] { typeof(AppSettingsAccessor) })]
public class ClientConfiguration : Configuration<IClientConfiguration>
{
[ConfigurationItem(Accessors = new Type[] {
typeof((RegistryAccessor))
})]
public bool BypassCertificateVerification { get; set; }
}
將相當於
var config = new Configuration<IClientConfiguration>();
config.SetDefaultAccessors(new[] { typeof(AppSettingsAccessor) });
config.SetPropertyAccessors(
property: x => x.BypassCertificateVerification,
accessors: new[] { typeof(RegistryAccessor) }
);
的訪問者應對閱讀&從各種來源(的AppSettings,註冊表的.ini,等等,等等)編寫。我希望允許消費者擴展能力以滿足他們的需求。我想保持它IoC容器不可知論者。 Type []約束是給我的,因爲由於編譯時和運行時問題,我無法在屬性中指定類型。
有沒有辦法有用於實例默認這些機制(例如,基於Activator.CreateInstance東西),而且還允許消費代碼來實例化這些訪問在運行時不使用服務定位器/依賴解析器模式?我一直在閱讀很多關於爲什麼服務定位器/依賴關係解析器模式是一個邪惡的反模式,但我找不出一個更好的工具。我使用依賴解析器查看MVC框架和SignalR庫。他們是100%的時間還是這個邊緣案例?據我所知,抽象工廠模式不會削減它,因爲它不喜歡類型參數。
在這種特殊情況下,基於屬性的配置將比聲明式方法更有用,所以我不想放棄配置屬性(這將允許我將Type更改爲IConfigurationAccessor並切換到工廠方法)。
我也在考慮DSL。我想到了一些沿着這些方向的東西,但是最終你會得到一個未加解析dsl的屬性,這個屬性幾乎沒有意義。 – 2013-02-22 16:25:58