只有累積,沒有奇蹟

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

建立類別
首先先建立一個相對應的類別 MemberConfig
  1. public class MemberConfig
  2. {
  3. public string Account { get; set; }
  4. public string Password { get; set; }
  5. }

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

使用 GetValue<T> 取得組態設定內容
先 new MemberConfig 的類別,接著可以使用 IConfiguration 的擴充方法 GetValue<T> 帶入 Key 取得想要的組態設定值,以上述的範例是輸入 Member:Account 可以取得 account 資訊,輸入 Member:Password 取得 Password 資訊,並將其結果輸出至網頁上確認是否正確 
  1. [HttpGet]
  2. public ActionResult<string> Get()
  3. {
  4. var memberConfig = new MemberConfig();
  5. memberConfig.Account = _config.GetValue<string>("Member:Account");
  6. memberConfig.Password = _config.GetValue<string>("Member:Password");
  7.  
  8. return $"Account is {memberConfig.Account} Password is {memberConfig.Password} ";
  9. }
輸出結果如下
解決方案 - IOptions
如果覺得使用 GetValue<T> 需要逐一設定有點麻煩,則可以參考 IOptions 方式注入 MemberConfig,建立強型別的類別步驟還是需要,步驟如下

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

注入 IOptions
並在 Controller 建構子時透過 DI 注入 IOptions,其型別為 MemberConfig 
  1. public MemberConfig _memberConfig { get; set; }
  2.  
  3. public ValuesController(IOptions<MemberConfig> memberConfig)
  4. {
  5. _memberConfig = memberConfig.Value;
  6. }

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

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

    Related Posts:

    • [VS2017] 如何修改 Visual Studio IDE 顯示語系 前言 目前筆電使用的 Visual Studio 是繁體中文版,在使用上用起來沒英文版那麼順,很多字詞在翻譯上總是讓人覺得驚喜,忍無可忍無須再忍決定改為英文版,過去 VS 可以透過下載的方式安裝語言包,但這招在 Visual Studio 2017 似乎無效(?,這邊簡單紀錄 Visual Studio 如何安裝不同語系的過程 設定語系 IDE 語系設定  設定方式 : 工具 > 選項 > 環境… Read More
    • [AWS] 使用 AWS SDK上傳檔案到 AWS S3前言 最近在與第三方做串接時,有個需求是要將圖片存起來放在 Application Server 上,與同事討論建議將圖片放在AWS S3 上,多年前有微軟剛推出 Azure 時有接觸過一些,但這幾年隨著年紀增長早已忘光光,這篇簡單紀錄 C# 透過 AWS SDK 將圖片上傳到 AWS S3 上的步驟與要注意的細節 AWS S3  Amazon Simple Storage Service 功能簡稱 S3,是Amazon的物件儲存服務,… Read More
    • [UnitTest] Visual Studio 2017 按右鍵無法建立單元測試 ? 問題 最近心血來潮使用家中舊電腦小白寫 Code,在練習測試中發現竟然有點怪異,在要測試的 method 按下右鍵沒有 建立單元測試 Create Unit Test 選項,但相同練習專案拿到公司筆電就是正常的,經比對後發現舊筆電 Visual Studio 版本少安裝測試功能,以下簡單紀錄解決問題的過程 解決方案 在 Visual Studio 2017 早期版本這是已知問題,有開發者在 vs community 回報給開… Read More
    • [.NET] 無法載入檔案或組件 'Newtonsoft.Json' 或其相依性的其中之一 (發生例外狀況於 HRESULT: 0x80131040)問題 接獲同事報案,反應在測試環境出現以下錯誤訊息 無法載入檔案或組件 'Newtonsoft.Json, Version=11.0.0.0, Culture=neutral, PublicKeyToken=30ad4fe6b2a6aeed' 或其相依性的其中之一。 找到的組件資訊清單定義與組件參考不符。 (發生例外狀況於 HRESULT: 0x80131040) ,實際專案底下 bin 資料夾該 dll 是存在的,心想這問題… Read More
    • [UnitTest] Visual Studio 2017 新增單元測試時沒有 NUnit 選項 ?前言 新筆電總是讓人充滿驚喜,在使用上除了要重新安裝常用的開發工具外,像是 Visual Studio & SQL Server..等必須工具,還有些常用的套件與小工具也要一併安裝,NUnit 是蠻常用的 Test Framwroek 之一,在寫測試時在要測試的 method 下按下右鍵 create Unit Tests,選擇要使用測試的 Test Framework 即可,在測試專案中預設只有 MSTest 選項,如果需要 NUnit… Read More

    0 意見:

    張貼留言

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

    Design by Anders Noren | Blogger Theme by NewBloggerThemes.com