只有累積,沒有奇蹟

2019年3月22日 星期五

[.NETCore] 如何取得 appsettings.json 組態設定

問題
在開發時有時會將資訊紀錄在 Web.Config 設定檔中的開發經驗,在 .NET Framework 要取得 web.config 自訂組態設定時可以透過  ConfigurationManager.AppSettings ,相信大家都有了解且不陌生;但今天場景換到 ASP.NET Core 時,在一開始建立好新專案後只有  appsettings.json  設定檔,那麼該如何取得 json 檔案中自己定義的組態設定內容呢 ? 今天就是要分享的是在 ASP.NET Core 中取得 appsettings.json 自訂組態設定值的方式若有問題歡迎提出一起討論或是給予指導

解決方案
一開始我先在 appsettings.json 自訂 Member 區段,其中裡面定義 Account 為 Marcus 與 Password 為 1234qwer 其組態設定屬性與相對應的值 
"Member": {
    "Account": "Marcus",
    "Password": "1234qwer" 
  } 
設定好 appsettings.json Member 的組態設定之後,接下來步驟就是要取得其 config 的內容,在 ASP.NET Core 中一開始執行的 Startup 類別就會透過 DI 注入  IConfiguration  組態設定檔內容,代碼如下
public Startup(IConfiguration configuration)
{
    Configuration = configuration;
} 
 IConfiguration  是在  Microsoft.Extensions.Configuration  namespace 底下的 interface,其內容是用 Dictionary 的方式來進行讀取以及存放,此 interface 取得可以透過用 key、GetSection、GetChildren 取得其組態設定資料或是資料集合,如下圖所示
簡單介紹了 IConfiguration 介面,知道了預設會將組態設定檔的內容會用 Dictionary 的方式存放在 IConfiguration 的 instance 中,下一步就是如何取得我們想要的組態設定內容值,步驟如下

建立類別
首先先建立一個相對應的類別 MemberConfig
public class MemberConfig
{
    public string Account  { get; set; }
    public string Password { get; set; }
} 

注入 IConfiguation
指定一個型別為 IConfiguration 的屬性 _config,並在 Controller 建構子時透過 DI 注入 IConfiguration 
private IConfiguration _config;
public ValuesController(IConfiguration config)
{
    _config = config;
}

使用 GetValue<T> 取得組態設定內容
先 new MemberConfig 的類別,接著可以使用 IConfiguration 的擴充方法 GetValue<T> 帶入 Key 取得想要的組態設定值,以上述的範例是輸入 Member:Account 可以取得 account 資訊,輸入 Member:Password 取得 Password 資訊,並將其結果輸出至網頁上確認是否正確 
[HttpGet]
public ActionResult<string> Get()
{
    var memberConfig = new MemberConfig();
    memberConfig.Account = _config.GetValue<string>("Member:Account");
    memberConfig.Password = _config.GetValue<string>("Member:Password");

    return $"Account is {memberConfig.Account} Password is {memberConfig.Password} ";
}
輸出結果如下
解決方案 - IOptions
如果覺得使用 GetValue<T> 需要逐一設定有點麻煩,則可以參考 IOptions 方式注入 MemberConfig,建立強型別的類別步驟還是需要,步驟如下

在 ConfigureServices 中加入 MemberConfig 配置
在 Startup 檔案中  ConfigureService  加上以下代碼
services.Configure<MemberConfig>(Configuration.GetSection("Member"));

注入 IOptions
並在 Controller 建構子時透過 DI 注入 IOptions,其型別為 MemberConfig 
public MemberConfig _memberConfig { get; set; }

public ValuesController(IOptions<MemberConfig> memberConfig)
{
    _memberConfig = memberConfig.Value;
}

輸出資訊
在輸出端整體就變單純許多,可以直接使用 memberConfig 類別內容,不用在逐一取得組態設定資訊內容,輸出結果相同這裡也就不在重複PO圖
[HttpGet]
public ActionResult<string> Get()
{
    return $"Account is {_memberConfig.Account} Password is {_memberConfig.Password} ";
}

感想
最近接觸 ASP.NET Core 越多越能發現 DI 注入在 .NET Core 上可以說是無所不在,從 Logging 到 Config 檔甚至其他更多的應用,在撰寫相關代碼時也幾乎不會看到 new ClassA() 的出現,從設計面著手透過 DI 來避免耦合度過高的問題產生,之後如果對 DI 有更多了解也希望自己可以整理出一篇文章,讓自己可以更了解帶來的好處與價值,以上如果有問題歡迎提出討論,Happy Coding !
    參考
    Configuration in ASP.NET Core

    0 意見:

    張貼留言

    Copyright © m@rcus 學習筆記 | Powered by Blogger

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com