試煉2 - appSettings 由簡單讀取到進階應用

2022 鐵人賽文 搬回點部落

開始試煉

再開發網站或是api的時候,多多少少都會將 不太常改又不想放資料庫 或是根本沒有資料庫的東西 通通塞到 appSettings裡面
也就容易到處出現
string appSettingEnableDemo = ConfigurationManager.AppSettings["EnableDemo"];
這樣的程式碼,但是這樣就又都是 Magic strings了

Web.Config 還是App.Config 都可以使用 appSettings 放值
<add key="EnableDemo" value="true"/>
取值的時候 還有考慮取不到的問題 跟 轉型的問題

string appSettingEnableDemo = ConfigurationManager.AppSettings["EnableDemo"];
var enableDemo = false;
if (!string.IsNullOrEmpty(appSettingEnableDemo))
{
    bool.TryParse(appSettingEnableDemo, out enableDemo);
}

然後很多地方要用到就會到處都是這樣的程式碼
可以用試煉1 - Magic strings學到的觀念 建立出下面的class

void Main()
{
    AppSetting.EnableDemo.Dump();
    AppSetting.EnableDemo.Dump();;
}
public class AppSetting
{
    private static bool? _enableDemo;
    public static bool EnableDemo
    {
        get
        {
            if (!_enableDemo.HasValue)
            {
                //var appSettingEnableDemo = ConfigurationManager.AppSettings["EnableDemo"];
                var appSettingEnableDemo = "true";//LINQPad 的關係 直接給值
                var enableDemo = false;
                if (!string.IsNullOrEmpty(appSettingEnableDemo))
                {
                    bool.TryParse(appSettingEnableDemo, out enableDemo);
                }
                _enableDemo = enableDemo;
            }

            return _enableDemo.Value;
        }
    }
}

好處是可以給預設值 跟 讀一次就放到記憶體 不用重複讀取
設定appSettings後 就一起把AppConfig class 對應的程式碼也寫好
其他人呼叫就會很方便

延伸試煉

也可以寫一個泛型方法像 可以看下面的連結
如何讀取Web.config中的AppSettings
AppSettings fallback/default value?

隱藏試煉

可以寫T4程式自動產生出AppSetting class 這裡有專案可以參考
https://github.com/motowilliams/T4-AppSettings

題外話 單元測試也可以appSettings做模擬的
Testing codes with ConfigurationManager.AppSettings

結束試煉

一個 appSettings 可以有這些試煉 好像是我一開始沒有想到的

如果內容有誤請多鞭策謝謝