在開發時有時會將資訊紀錄在 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 其組態設定屬性與相對應的值
設定好 appsettings.json Member 的組態設定之後,接下來步驟就是要取得其 config 的內容,在 ASP.NET Core 中一開始執行的 Startup 類別就會透過 DI 注入 IConfiguration 組態設定檔內容,代碼如下
- "Member": {
- "Account": "Marcus",
- "Password": "1234qwer"
- }
IConfiguration 是在 Microsoft.Extensions.Configuration namespace 底下的 interface,其內容是用 Dictionary 的方式來進行讀取以及存放,此 interface 取得可以透過用 key、GetSection、GetChildren 取得其組態設定資料或是資料集合,如下圖所示
- public Startup(IConfiguration configuration)
- {
- Configuration = configuration;
- }
簡單介紹了 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 意見:
張貼留言