iT邦幫忙

2022 iThome 鐵人賽

DAY 2
0
Software Development

離開C#新手村的最後試煉系列 第 2

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

  • 分享至 

  • xImage
  •  

開始試煉

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

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

var 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 可以有這些試煉 好像是我一開始沒有想到的


上一篇
試煉1 - 如何消滅 Magic strings
下一篇
試煉3 - Debug 時,是怎麼看變數內容的呢
系列文
離開C#新手村的最後試煉30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言