小明收到需求, 需要在系統中不同環境中設定特別組態,
然後系統依照組態設定去執行不同的動作.
public string GetSetting(string key) {
return ConfigurationManager.AppSettings[key] ?? "";
}
public void Perform() {
if( GetSetting("isCountDownEnabled") == "y" ) {
...
}
var time = DateTime.Parse(GetSetting("OpenTime"));
...
}
這段程式很清楚在嘗試讀取 "isCountDownEnabled", "OpenTime" 的內容,
然後去做一些事情.
首先這程式有個缺點, 就是組態讀取的方式是動態類型, 讀取出來的值是弱類型.
弱類型, 是指類型檢查更不嚴格, 如偏向於容忍隱式類型轉換.
譬如說"isCountDownEnabled" 這個是因為字串很容易打錯字, 導致開發人員不小心沒有讀取到組態.
而且讀取出來的Value 內容比對判斷方式是 "y" 也可以是 "Y", 甚至其他內容,
這樣的結果是容易產生forbidden behaviours.
幾乎每個專案都有一些需要根據環境配置和更改的設定,
典型的例子是大多數人都會在 .config 檔案中 的區段加上key 和 value
<configuration>
<appSettings>
<add key="IsCountDownEnabled" value="y"/>
<add key="OpenTime" value="2019/08/01"/>
</appSettings>
</configuration>
設計守則 為組態設定建立一個強類型物件
建議的方法是創建一個強類型配置物件, 其結構與組態配置文件中的某個部分(或從中加載配置的任何位置) 匹配, 像
public class MySettings
{
public bool IsCountDownEnabled { get; set; }
public DateTime OpenTime { get; set; }
}
它將映設到 .config 檔案中的 appSettings 區段. 組態設定檔案可以按照你喜好
放在 web.config 或是其他外部檔案. (例如: D:\Configs\MySettings.xml)
MySettings.xml 檔案示範內容
<configuration>
<MySettings>
<IsCountDownEnabled>y</IsCountDownEnabled>
<OpenTime>2019/08/01</OpenTime>
</MySettings>
</configuration>
為了確保您的 config 設定內容綁定到 MySettings 物件, 你需要做兩件事.
var builder = new ConfigurationBuilder();
builder.AddXmlFile("MySettings.xml", optional: true, reloadOnChange: true);
最後再透過 Build() 來建立
var configuration = builder.Build();
然後再用configuration 去綁定你的MySettings 組態物件
var myConfig = new MySettings();
configuration.GetSection("MySettings").Bind(myConfig);
if (myConfig.IsCountDownEnabled == true)
{
...
}
它可以載入 *.ini, *.json, *.xml 檔案, 上面的程式碼是加入 xml 的例子, 你可以使用 AddIniFile() 或 AddJsonFile() 來加入不同的檔案.
又或者您不希望把設定內容放在到 config 檔案中, 改放到自己定義的資料庫中.
你也只需要做兩件事情
public class MyAppSettingDbConfigSource : IConfigurationSource
{
public IConfigurationProvider Build(IConfigurationBuilder builder)
{
return new MyAppSettingDbConfigurationProvider();
}
}
public class MyAppSettingDbConfigurationProvider : ConfigurationProvider
{
public override void Load()
{
//將你資料庫的內容讀取出來, 放入對應的資料
Data["MySettings:IsCountDownEnabled"] = "y";
Data["MySettings:OpenTime"] = "2019/08/01";
base.Load();
}
}
實作完自訂的組態來源提供者之後, 透過下面程式碼就可以載入自訂來源
var builder = new ConfigurationBuilder();
builder.Add(new MyAppSettingDbConfigSource());
上述Configuration 機制來源是Microsoft.Extensions.Configuration 提供的, 並非只設計在 AspNetCore 之下.這個Configuration 是可以讓廣泛的.net 程式所使用, 不侷限於ASP.NET Core.