2018年11月14日 星期三

在 ASP.NET Core 專案內使用選項模式讀取設定檔與環境變數組態設定值

在 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 屬性將會從環境變數中讀取而來。
C Sharp / C#
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 這個類別來進行系統組態設定的綁定
C Sharp / C#
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> 實作物件注入之後,我們就可以透過該物件內的屬性值,讀取到所綁定系統中的組態值。
C Sharp / C#
[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
}
}



沒有留言:

張貼留言