一、簡要闡述
ASP.NET Core引入了Options模式,使用類來表示相關的設定組。簡單的來說,就是用強型別的類來表達配置項,這帶來了很多好處。利用了系統的依賴注入,並且還可以利用配置系統。它使我們可以採用依賴注入的方法直接使用繫結的一個物件,這個物件就叫做Options物件。也可以叫做配置物件。
引入NuGet包:Microsoft.Extensions.Options
二、使用場景
- IOptions
- 不支援
- 在應用啟動後讀取配置資料。
- 命名選項
- 註冊為單一例項,可以注入到任何服務生存期。
- IOptionsSnapshot
- 作用域容器配置熱更新使用它
- 註冊為範圍內,因此無法注入到單一例項服務
- 支援命名選項
- 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事件,且讀取的配置是最新的。