.Net Core之選項模式Options使用

SportSky發表於2022-03-03

一、簡要闡述

ASP.NET Core引入了Options模式,使用類來表示相關的設定組。簡單的來說,就是用強型別的類來表達配置項,這帶來了很多好處。利用了系統的依賴注入,並且還可以利用配置系統。它使我們可以採用依賴注入的方法直接使用繫結的一個物件,這個物件就叫做Options物件。也可以叫做配置物件。

引入NuGet包:Microsoft.Extensions.Options

 

二、使用場景

  1. IOptions
  • 不支援
    • 在應用啟動後讀取配置資料。
    • 命名選項
  • 註冊為單一例項,可以注入到任何服務生存期。
  1. IOptionsSnapshot
  • 作用域容器配置熱更新使用它
  • 註冊為範圍內,因此無法注入到單一例項服務
  • 支援命名選項
  1. IOptionsMonitor
  • 用於檢索選項並管理 TOptions 例項的選項通知。
  • 註冊為單一例項且可以注入到任何服務生存期。
  • 支援
    • 更改通知
    • 命名選項
    • 可過載配置
    • 選擇性選項失效

使用 IOptionsSnapshot 讀取已更新的資料

IOptionsMonitor 和 IOptionsSnapshot 之間的區別在於:

  • IOptionsMonitor 是一種單一示例服務,可隨時檢索當前選項值,這在單一例項依賴項中尤其有用。
  • IOptionsSnapshot 是一種作用域服務,並在構造 IOptionsSnapshot 物件時提供選項的快照。 選項快照旨在用於暫時性和有作用域的依賴項。

三、程式碼例項

1、實體類

public class MyOptionSetting
    {
        /// <summary>
        /// 姓名
        /// </summary>
        public string UserName { get; set; }
        /// <summary>
        /// 年齡
        /// </summary>
        public int Age { get; set; }
        /// <summary>
        /// 電話
        /// </summary>
        public string Phone { get; set; }
        /// <summary>
        /// 性別
        /// </summary>
        public string Sex { get; set; }
    }

 

2、控制器層

public class HomeController : Controller
    {
        private readonly ILogger<HomeController> _logger;
        private readonly IOptions<MyOptionSetting> _options;
        private readonly IOptionsSnapshot<MyOptionSetting> _optionsSnapshot;
        private readonly IOptionsMonitor<MyOptionSetting> _optionsMonitor;

        public HomeController(ILogger<HomeController> logger
            , IOptions<MyOptionSetting> options
            , IOptionsSnapshot<MyOptionSetting> optionsSnapshot
            , IOptionsMonitor<MyOptionSetting> optionsMonitor)
        {
            _logger = logger;
            _options = options;
            _optionsSnapshot= optionsSnapshot;
            _optionsMonitor = optionsMonitor;
            _optionsMonitor.OnChange(ChangeListener);
        }

        /// <summary>
        /// 當選項模式是IOptionsMonitor ,修改配置檔案appsetting.json儲存時候會觸發OnChange事件
        /// </summary>
        /// <param name="options"></param>
        private void ChangeListener(MyOptionSetting options)
        {
            Console.WriteLine(options.Age);
        }

        public IActionResult Index()
        {

            {
                // 獲取UserName欄位名資訊
                var options = _options.Value.UserName;
                _logger.LogInformation($"options獲取UserName欄位名資訊:{options}");
                // 獲取MyOptionSetting所有配置資訊
                var optionJson = JsonConvert.SerializeObject(_options.Value);
                _logger.LogInformation($"options獲取MyOptionSetting所有配置資訊:{optionJson}");
            }

            {
                // 獲取UserName欄位名資訊
                var optionSnapshot = _optionsSnapshot.Value.UserName;
                _logger.LogInformation($"optionSnapshot獲取UserName欄位名資訊:{optionSnapshot}");
                // 獲取MyOptionSetting所有配置資訊
                var optionSnapshotJson = JsonConvert.SerializeObject(_optionsSnapshot.Value);
                _logger.LogInformation($"optionSnapshot獲取MyOptionSetting所有配置資訊:{optionSnapshotJson}");
            }

            {
                // 獲取UserName欄位名資訊
                var optionsMonitor = _optionsMonitor.CurrentValue.UserName;
                _logger.LogInformation($"optionsMonitor獲取UserName欄位名資訊:{optionsMonitor}");
                // 獲取MyOptionSetting所有配置資訊
                var optionsMonitorJson = JsonConvert.SerializeObject(_optionsMonitor.CurrentValue);
                _logger.LogInformation($"optionsMonitor獲取MyOptionSetting所有配置資訊:{optionsMonitorJson}");
            }

            return View();
        }

        public IActionResult Privacy()
        {
            return View();
        }
    }

3、Startup類ConfigureServices方法注入配置

public void ConfigureServices(IServiceCollection services)
        {
            services.AddControllersWithViews();

            // 注入
            services.Configure<MyOptionSetting>(Configuration.GetSection("MyOptionSetting"));
        }

4、appsettings.json檔案配置

  "MyOptionSetting": {
    "UserName": "xiaohemiao",
    "Age": 19,
    "Phone": "10086",
    "Sex": "nan"
  }

四、效果呈現

 

 

 五、劃重點,最通俗的理解

1、使用IOptions,當程式正在執行中時,修改appsettings.json之後,重新整理頁面,頁面讀取的配置資訊不會改變,讀取的還是原來的配置資訊。

2、使用IOptionsSnapshot,當程式正在執行中時,修改appsettings.json之後,重新整理頁面,頁面讀取的配置資訊是最新的資訊。

3、使用IOptionsMonitor,當程式正在執行中時,修改appsettings.json之後,重新整理頁面,頁面讀取的配置資訊是最新的;當在頁面中使用了監聽事件,修改appsettings.json儲存的時候會自動觸發如上的OnChange事件,且讀取的配置是最新的。

相關文章