在開發時有時會將資訊紀錄在 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 意見:
張貼留言