在 ASP.NET Core 專案內使用選項模式讀取設定檔與環境變數組態設定值
當我們建立 ASP.NET Core 專案之後,我們可以透過選項模式,從底下這些地方取得動態設定資訊。
- Azure Key Vault
- 命令列引數
- 自訂提供者 (已安裝或已建立)
- 目錄檔案
- 環境變數
- 記憶體內部 .NET 物件
- 設定檔
在這篇文章中,我們將會使用 設定檔 與 環境變數 定義一些系統要用的參數,接著建立一個類別,這個類別內將會有定義許多屬性,透過 IOptions 來注入這個客製化類別,此時,所注入的物件內屬性,將會自動綁定到 設定檔與環境變數上設定的值。本篇文章的範例原始碼,可以從 OptionsPattern 取得。
首先,使用 Visual Studio 2017 建立一個 ASP.NET Core 專案,名稱為 OptionsPattern ,我們這裡將會選擇建立一個 Web API 類型的專案。
現在,建立一個 MyOptions 類別,在這個類別內,將會宣告許多屬性,這些屬性名稱將會對應到 設定檔 或者 環境變數 的鍵值名稱;另外,在這個 MyOptions 類別中,會有一個 ExectionMode 屬性,將會是另外一個類別型別 ExcetionMode,在這個 ExcetionMode 類別內有個屬性 ShowType,將會是列舉型別的屬性,我們將會了解當讀取選項的時候,將會自動轉換成為相對應的列舉值。
這裡絕大部分的屬性將會對應到 設定檔 內的 JSON 宣告,只有 MyName 屬性將會從環境變數中讀取而來。
public class MyOptions
{
public string ConnectionString { get; set; }
public bool ActionMode { get; set; }
public string OS { get; set; }
public string MyName { get; set; }
public ExcetionMode ExcetionMode { get; set; }
}
public class ExcetionMode
{
public ExcetionModeType ShowType { get; set; }
public int Max { get; set; }
}
public enum ExcetionModeType
{
Detail,
None,
More
}
現在開啟 Startup.cs 檔案,找到 ConfigureServices 方法,在這個方法內,加入
services.Configure<MyOptions>(Configuration);
這個方法呼叫,告知要使用 MyOptions 這個類別來進行系統組態設定的綁定public void ConfigureServices(IServiceCollection ervices)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
services.Configure<MyOptions>(Configuration);
}
最後,我們打開 Controllers 資料夾下的 ValuesController.cs 檔案,並且將這個檔案修正成為底下程式碼。
對於 ValuesController 這個類別,我們僅有修正
public ActionResult<MyOptions> Get()
這個方法,修改該方法將會回傳 IOptions.Value 這個屬性值。
另外,我們在這個類別內加入一個建構函式,這是為了要能夠使用相依性注入功能,請求 IoC 容器幫我們注入
IOptions<MyOptions>
物件;一旦 IOptions<MyOptions>
實作物件注入之後,我們就可以透過該物件內的屬性值,讀取到所綁定系統中的組態值。[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
private readonly IOptions<MyOptions> options;
public ValuesController(IOptions<MyOptions> options)
{
this.options = options;
}
// GET api/values
[HttpGet]
public ActionResult<MyOptions> Get()
{
//return new string[] { "value1", "value2" };
return options.Value;
}
// GET api/values/5
[HttpGet("{id}")]
public ActionResult<string> Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody] string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody] string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
在進行測試該專案之前,請先打開 appsettings.json 檔案,修正成為底下的內容,在這裡所看到的 Json 宣告,絕大部分將會對應到 MyOptions 這個類別內的屬性,只不過在 MyOptions 類別中有個
public string MyName { get; set; }
屬性,他的值將會透過系統的環境變數來取得。
由於這個 appsettings.json 檔案是由 Visual Studio 在建立專案的時候自動建立起來的,不過,這個檔案預設編碼格式為 ASCII,為了要能夠讓這個專案所讀取的組態設定內容不會有中文亂碼,請使用 記事本 這個程式打開這個檔案 appsettings.json ,重新儲存並指定使用 UTF-8 編碼。
{
"ConnectionString": "連線參數",
"ActionMode": false,
"ExcetionMode": {
"ShowType": "Detail",
"Max": 200
},
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*"
}
最後,打開 命令提示字元視窗,切換到這個專案的根目錄下,輸入
dotnet run
。一旦專案編譯沒有發生錯誤,將會開始執行,現在,請使用瀏覽器打開網址列 https://localhost:5001/api/values
,現在將會看到底下的輸出內容。我們可以看到絕大部分的都是存在於 appsettings.json 設定檔內,只有 myName 這個屬性沒有任何值,這是因為,我們尚未在系統中設定該環境變數。{
connectionString: "連線參數",
actionMode: false,
os: "Windows_NT",
myName: null,
excetionMode: {
showType: 0,
max: 200
}
}
現在,請在 命令題是字元 視窗內,輸入這個指令
set myname=Vulcan Lee
,接著再輸入 dotnet run
重新執行這個專案,然後,請使用瀏覽器打開網址列 https://localhost:5001/api/values
,現在將會看到底下的輸出內容。{
connectionString: "連線參數",
actionMode: false,
os: "Windows_NT",
myName: "Vulcan Lee",
excetionMode: {
showType: 0,
max: 200
}
}