iT邦幫忙

0

組態設定設計

c#

組態設定設計

小明收到需求, 需要在系統中不同環境中設定特別組態,
然後系統依照組態設定去執行不同的動作.

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 物件, 你需要做兩件事.

  • 設置ConfigurationBuilder 加載組態設定檔案
var builder = new ConfigurationBuilder();
  • 將您的組態物件綁定到配置部分
    你需要使用nuget 引用Microsoft.Extensions.Configuration.Xml
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 檔案中, 改放到自己定義的資料庫中.

你也只需要做兩件事情

  • 建立 IConfigurationSource 來源
public class MyAppSettingDbConfigSource : IConfigurationSource
{
   public IConfigurationProvider Build(IConfigurationBuilder builder)
   {
      return new MyAppSettingDbConfigurationProvider();
   }
}
  • 建立 Configuration 自訂提供者
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.


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言