????這節我們來講一下,在ASP.NET Core Web開發中,讀取配置文件信息的新方式:Options。
前言?/
Options
????在ASP.NET Web框架中,我們讀取配置文件中的數據,在不使用第三方框架的情況下,可能需要通過ConfigurationManager這個類去讀取配置文件中的信息,并且,如果我們人為更改了配置文件,需要重啟系統才能使新的配置數據生效。這種方式并不能稱得上優雅和高效。
????所以,在ASP.NET Core Web框架中,微軟為我們提供了讀取配置信息的新方式——將配置信息映射到數據類中,并且配合IOC,可以通過依賴注入的方式拿到這個類,讀取我們想要的信息,下面就來了解一下它。
如何配置?/
Options
????首先,我們需要如下前置信息:
在appsettings.json中配置要讀取的信息(如下圖,此處名稱“MyOptions”可自定義)
對應的編寫一個數據類
????然后,我們就可以選擇在Startup.cs中,編寫配置相關代碼(在Program.cs文件中也可以指定配置,具體大家可以參考官網文檔),請看下圖:
????在ConfigureServices方法中,我們可以配置Options。方式有很多種,此處僅演示比較簡單的幾種。通過使用services的Configure/AddOptions泛型方法,其泛型類型為要映射的類,然后指定要讀取的區域(即Section),即可完成配置。默認如果不指定SectionName,則自動使用類名進行匹配,如果讀取SectionName跟映射的類名不一致,則使用其重載方法,傳入SectionName即可。
IOptions<T>/
Options
? ? 在完成配置以后,就可以使用依賴注入的方式,在需要的地方獲取到配置信息,注入的形式之一是IOptions<T>接口,泛型T則指定為映射的配置類,請看下圖:
? ? 使用IOptions<T>注入的配置對象,不具有動態性,也就是說系統運行時修改配置文件,是不會自動更新的。所以可以在類中直接聲明配置類對象,在構造方法中直接從IOptions的Value屬性中取到。
????讓我們打印出來看一下:
????這樣的形式,是優雅的,面向對象的,但是在系統的整個運行過程中,使用IOptions<T>注入的配置對象,是不會隨配置信息的改變而變化的,也就說,還是要重啟才能看到配置信息的更改。
IOptionsSnapshot<T>/
Options
????當然,除了IOptions<T>,我們還可以使用IOptionsSnapshot<T>去注入配置對象:
??? IOptionsSnapshot接口,提供了對配置信息的更新功能,但是并不是實時的,在同一個域或者本次請求中如果出現配置信息更改,配置對象中的數據是不會變化的,也就是保證整個上下文中的配置信息不會改變。為此,上述代碼中我與IOptions做出對比,第一次請求數據兩者相同,為初始值:
//第?1?次請求
IOptions:name:Charles,age:18,profession:.NET Developer
IOptionsSnapshot:name:Charles,age:18,profession:.NET Developer
然后我修改配置文件,進行第二次請求,IOptionsSnapshot重新讀取了配置信息:
//第?2?次請求
IOptions:name:Charles,age:18,profession:.NET Developer
IOptionsSnapshot:name:宿春磊,age:19,profession:.NET 開發者
IOptionsMonitor<T>/
Options
????最后,除了IOptionsSnapshot,微軟還提供了IOptionsMonitor,這位則是提供“全天候”的配置監控服務,配置文件一改,它就立刻更新,請看下圖:
? ? 我將三者做一對比,在讀取前就通過代碼更新配置文件,因為OptionsPattern是延遲讀取的,所以在改之前使IOptionsSnapshot讀取一遍值,這樣才能體現出三者的不同:
//第?1?次請求
IOptions:name:宿春磊,age:19,profession:.NET 開發者
IOptionsSnapshot:name:宿春磊,age:19,profession:.NET?開發者
IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET?開發者
? ? 第二次請求的時候,IOptionsSnapshot才取到新值。
//第?2?次請求
IOptions:name:宿春磊,age:19,profession:.NET 開發者
IOptionsSnapshot:name:宿春磊Charles,age:19,profession:.NET 開發者
IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET 開發者
本節到此結束...
參考:
https://docs.microsoft.com/zh-CN/dotnet/core/extensions/options