Options模式是Asp.Net Core中用於配置的一種模式,它利用了系統的依賴注入,並且還可以利用配置系統。它使我們可以采用依賴注入的方法直接使用綁定的一個POCO對象,這個POCO對象就叫做Options對象。也可以叫做配置對象。
Options模式中的核心對象如下:
IOptions<TOptins>:非具名,它代表了系統中同一種類的POCO配置對象。在系統中是singleton,應用級別的注入。
IOptionsSnapshot<TOptions>:具名,它用名稱代表了某一個具體的配置對象。從名字可以看出它能實時的捕獲到配置對象的變化。在系統中是Scope,請求級別的注入。
IOptionsFactory<TOptions>:工廠,創建TOptions的工廠。在系統中是Transient。即用即棄。
IOptionsMonitorCache<TOptinos>:緩存,工廠創建的對象會被放到緩存中。在系統中是Singleton,應用級別的注入。
OptionsManager<TOptions>
這個類是IOptinos和IOptionsSnapshot這兩個接口的默認實現。
這個類的構造函數需要傳入IOptionsFactory<TOptions>。隨后,還會在內部自創建一個實現了IOptinsMonitorCache的對象(OptionsCache)。OptionsManager本身是用來提供TOptions實例的,它內部又依賴IOptionsFactory這個工廠對象來創建對象。factory創建好的對象放到它內部的自創建的這個緩存上面。以獨占的方式來對Toptions對象進行緩存。
原理上,IOptions表示的是不具名對象,IOptionsSnapshot接口表示的具名對象,但是在他們兩個的實現OptionsManager中都是調用的同一個方法,只不過Ioptions提供了一個空字符串來表示不具名。在OptionsManager內部最終會調用Get方法來獲取TOptions對象.
IOptinsFactory
默認的實現是OptionsFactory。接口有一個Create方法,接受一個string name參數,OptionsFactory提供Toptions對象總的來說有兩個過程,TOptions的實例化和TOptinos的初始化。實例化的過程就是直接new 了一個TOptions對象,因為在接口約束里面對TOptions有new()約束,所以可以直接new出來這個對象,而初始化的過程是由三個接口來提供實現的,這三個接口分別是
①IConfigureOptions<in TOptions>
②IConfigureNamedOptions<in TOptins>:IConfigureOptions<TOptions> 注:它繼承了IConfigureOptions接口。
③IPostConfigureOptions<in Toptions>
初始化的順序為先執行①和②,再執行③。
這三個接口是在Service.Configure<TOptions>(this IServiceCollection services,string name,Action<Toptions> configureOptions) where TOptions:class這個擴展方法中進行配置的,最終,會調用services.AddSingleton<IConfigureOptions<Toptions>>(new ConfigureNamedOptions<Toptions>(name,configureOptions));這個方法,注冊一個應用級別的服務。ConfigureNamedOptions實現了IConfigureOptions和IConfigureNamedOptions這兩個接口。