iT邦幫忙

2024 iThome 鐵人賽

DAY 12
0
佛心分享-IT 人自學之術

靠近 ASP .NET Core 一點點系列 第 12

Day 12 組態 Configuration : 如何設定與取得 ?

  • 分享至 

  • xImage
  •  

分享主軸

  • 三種取得設定檔的服務的生命週期與意義
  • 如何從設定檔案內取得設定值

取值三種服務

IOptions<>

  • IOptions<> 提供了一種全域註冊的方式,整個應用程式只會注入一次,並且只會產生一個實例。這意味著在應用程式的整個生命週期中,IOptions<> 的值是不會變的,即使設定檔案(如 appsettings.json)發生了變更,IOptions<> 也不會更新

特點

  1. 全域註冊,單例模式(Singleton)
  2. 不支援動態更新
  3. 適用於不需要頻繁變更的設定值

IOptionsSnapshot<>

  • IOptionsSnapshot<> 是作用域(Scoped)註冊的,每次 HTTP 請求都會重新獲取一次設定值。如果設定檔案發生了變更,IOptionsSnapshot<> 會在下一次請求時更新設定值

特點

  1. 每次請求都會重新獲取設定值
  2. 支援動態更新,但僅限於檔案類型的組態(如 appsettings.json)
  3. 適用於需要在每次請求中獲取最新設定值的情境

IOptionsMonitor<>

  • IOptionsMonitor<> 是單例模式(Singleton)註冊的,但它支援動態更新。每次使用 IOptionsMonitor<> 時,都會檢查設定檔案是否發生變更,並自動更新設定值。這意味著即使在同一個請求中多次使用 IOptionsMonitor<>,每次都會獲取最新的設定值。

特點

  1. 單例模式註冊,但支援動態更新
  2. 每次使用時都會檢查設定檔案是否變更
  3. 適用於需要即時反映設定變更的情境

IOptions<> 和 IOptionsMonitor<> 都是單例模式,但 IOptionsMonitor<> 提供了動態更新的能力,使其能夠在設定檔案變更時自動更新設定值,而 IOptions<> 沒有辦法即時更新

如何取值

有兩種,一種是強型別方式取值,一種是直接取值方式
這裡強型別方式搭配 IOptions<> 舉例,取值寫法有很多種,這邊以其中一種常見寫法,設定值資料結構可以多層,也可以單層

單層

program.cs註冊 :

builder.Services.Configure<AppsettingsOptions>(builder.Configuration.GetSection(AppsettingsOptions.AppSettings))

appsettings.json :

{
  "AppSettings": {
    "AppName": "MyApplication",
    "Version": "1.0.0"
  }
}

創一個類別 :

public class AppsettingsOptions {

    public const string AppSettings = "AppSettings";

    public string AppName { get; set; }
    public string Version { get; set; }
}

要取用的地方 :

public class HomeController : Controller {

    private readonly IOptions<AppsettingsOptions> _options;
    
    public HomeController(IOptions<AppsettingsOptions> appSettings) {
        _appSettings = appSettings;
    }

    public IActionResult Index() {
        ViewData["AppName"] = _appSettings.Value.AppName;
        ViewData["Version"] = _appSettings.Value.Version;
        return View();
    }
}

多層

appsettings.json :

{
  "AppSettings": {
    "Demo":{
        "AppName": "MyApplication",
        "Version": "1.0.0"
     }
  }
}

創一個類別 :

public class AppsettingsOptions {

    public const string AppSettings = "AppSettings";

    public DemoOptions Demo { get; set; }
}

public class DemoOptions
{
    public string AppName { get; set; }
    public string Version { get; set; }
 }

要取用的地方 :

public class HomeController : Controller {

    private readonly IOptions<AppsettingsOptions> _options;
    
    public HomeController(IOptions<AppsettingsOptions> appSettings) {
        _appSettings = appSettings;
    }

    public IActionResult Index() {
        ViewData["AppName"] = _appSettings.Value.Demo.AppName;
        ViewData["Version"] = _appSettings.Value.Demo.Version;
        return View();
    }
}

也可以在取設定檔案值時候,在model binding時,加入驗證屬性

必填、一些正規表達驗證等等都可以,但僅限於第一層,多層不適用,如下有附上一篇教學文章

public class AppsettingsOptions {

    public const string AppSettings = "AppSettings";

    [Required]
    public string AppName { get; set; }
    
    [Required]
    public string Version { get; set; }
}

https://medium.com/@vijaykr100/options-pattern-in-asp-net-core-7121e7bd5054

簡單統整今日重點

  • 了解組態取得的服務方式有三種以及這三種各別差異
  • 了解如何取值
  • 了解取出來的值也可以驗證

今日結語
組態今天分享完畢,希望到目前為止已經對 ASP .NET Core 架構有更深入的了解

加油加油,明日繼續努力 ~

參考教學文章
https://www.c-sharpcorner.com/article/appsettings-6-ways-to-read-the-config-in-asp-net-core-3-0/?glarity_translate=1

https://learn.microsoft.com/zh-tw/aspnet/core/fundamentals/configuration/?view=aspnetcore-8.0&glarity_translate=1


上一篇
Day 11 組態 Configuration
下一篇
Day 13 Logging : 系統基本、輸出、錯誤資訊可以怎麼紀錄 ?
系列文
靠近 ASP .NET Core 一點點13
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言