asp.net-core選項模塊是全新,可拓展的框架,其作用在整個.net-core框架中,就像依賴註入一樣無處不在,是一個很重要的組件。 其實配置模塊與選項模塊是緊密相連的,我們可以使用ConfigureBuilder類來使用配置,但是在Startup類中,我們使用了依賴註入來實現IConfigu ...
asp.net-core選項模塊是全新,可拓展的框架,其作用在整個.net-core框架中,就像依賴註入一樣無處不在,是一個很重要的組件。
其實配置模塊與選項模塊是緊密相連的,我們可以使用ConfigureBuilder類來使用配置,但是在Startup類中,我們使用了依賴註入來實現IConfiguration介面(Startup類中的構造函數中使用依賴註入來實例化IConfiguration介面),通過這個介面對象來實現各種配置。但是配置不是我們主要講的,這篇文章主要分析選項模塊。
要說選項就一定要瞭解IOptions<TOptions>介面,這個介面只要有個屬性:
public interface IOptions<out TOptions> where TOptions : class, new() { TOptions Value { get; } }
在這裡我們從兩個示例來描述選項。第一個示例就是微軟官網的選項示例。首先定義一個MyOptions類:
public class MyOptions { public string Option1 { get; set; } public int Option2 { get; set; } = 5; public MyOptions() { Option1 = "value1 from ctor"; } }
依賴註入實例化MyOptions類:
// 非派生自IOptions的類 DI註入(具體可以參考源碼) services.Configure<MyOptions>(Configuration);
接下來我們在Index.cshtml.cs文件:
private readonly MyOptions _options; public string SimpleOptions{ get; private set;}
然後在IndexModel的構造函數中註入(主要就是實現依賴註入):
public IndexModel(IOptions<MyOptions> optionAccessor) { _options = optionAccessor.Value; }
在OnGet()方法中:
public void OnGet() { var option1 = _options.Option1; var option2 = _options.Option2; SimpleOptions = $"option1 = {option1}, option2 = {option2}"; }
接下來在就是Index.cshtml:
@page @model IndexModel @using OptionsBeta.Models @{ ViewData["Title"] = "Home page"; } <h3>基本選項配置, 不派生自IOptions介面的實現</h3> @Model.SimpleOptions
但是一般情況下我們都是繼承自IOptions介面做我們自己的選項。那麼應該怎麼來做呢?代碼如下:
public class MyOptionsDelegate : IOptions<MyOptionsDelegate> { public MyOptionsDelegate() { Option1 = "value1 from ctor"; } public string Option1 { get; set; } public int Option2 { get; set; } = 5; public MyOptionsDelegate Value { get { return this; } } }
我們實現一個IOptions<TOptions>的類,接著我們基於IServiceCollection介面拓展一個方法:
public static IServiceCollection AddOptionsByDelegate(this IServiceCollection services, Action<MyOptionsDelegate> setupAction) { services.Configure(setupAction); return services; }
然後我們在ConfigurationServices方法中註入實例:
// 拓展方法的方式實現 services.AddOptionsByDelegate(myOptions => { myOptions.Option1 = "rrrrrrrrrrrrrrrrrrrrrrrrrr"; myOptions.Option2 = 280000; });
接下來,Index.cshtml.cs文件:
private readonly MyOptionsDelegate _optionsDelagate; public IndexModel(IOptions<MyOptions> optionAccessor, IOptions<MyOptionsDelegate> optionsDelegate) { _options = optionAccessor.Value; _optionsDelagate = optionsDelegate.Value; } public string SimpleOptionsByDelagate { get; private set; }
在OnGet方法中:
var optionsByDelegate3 = _optionsDelagate.Option1; var optionsByDelegate4 = _optionsDelagate.Option2; SimpleOptionsByDelagate = $"optionsByDelegate3 = {optionsByDelegate3}, optionsByDelegate4 = {optionsByDelegate4}";
在Index.cshtml中:
<h3>基於委托配置簡單選項, 派生自IOptions介面的實現並使用了拓展方法的方式註入依賴</h3>
@Model.SimpleOptionsByDelagate
運行如下: