asp.net-core选项模块是全新,可拓展的框架,其作用在整个.net-core框架中,就像依赖注入一样无处不在,是一个很重要的组件。
其实配置模块与选项模块是紧密相连的,我们可以使用ConfigureBuilder类来使用配置,但是在Startup类中,我们使用了依赖注入来实现IConfiguration接口(Startup类中的构造函数中使用依赖注入来实例化IConfiguration接口),通过这个接口对象来实现各种配置。但是配置不是我们主要讲的,这篇文章主要分析选项模块。
要说选项就一定要了解IOptions<TOptions>接口,这个接口只要有个属性:public interface IOptionswhere 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(Configuration);
接下来我们在Index.cshtml.cs文件:
private readonly MyOptions _options;public string SimpleOptions{ get; private set;}
然后在IndexModel的构造函数中注入(主要就是实现依赖注入):
public IndexModel(IOptionsoptionAccessor){ _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";}基本选项配置, 不派生自IOptions接口的实现
@Model.SimpleOptions
但是一般情况下我们都是继承自IOptions接口做我们自己的选项。那么应该怎么来做呢?代码如下:
public class MyOptionsDelegate : IOptions{ 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, ActionsetupAction){ services.Configure(setupAction); return services;}
然后我们在ConfigurationServices方法中注入实例:
// 拓展方法的方式实现services.AddOptionsByDelegate(myOptions =>{ myOptions.Option1 = "rrrrrrrrrrrrrrrrrrrrrrrrrr"; myOptions.Option2 = 280000;});
接下来,Index.cshtml.cs文件:
private readonly MyOptionsDelegate _optionsDelagate;public IndexModel(IOptionsoptionAccessor, IOptions 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中:
基于委托配置简单选项, 派生自IOptions接口的实现并使用了拓展方法的方式注入依赖
@Model.SimpleOptionsByDelagate
运行如下:
demo代码: 链接:https://pan.baidu.com/s/1CqS8xRd_gzPxhke96mGITA 密码:28wn