加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

详解ASP.NET Core3.0 配置的Options模式

发布时间:2020-08-21 13:35:43 所属栏目:编程 来源:网络整理
导读:这篇文章主要介绍了详解ASP.NET Core3.0 配置的Options模式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面
副标题[/!--empirenews.page--]

上一章讲到了配置的用法及内部处理机制,对于配置,ASP.NET Core还提供了一种Options模式。

一、Options的使用

上一章有个配置的绑定的例子,可以将配置绑定到一个Theme实例中。也就是在使用对应配置的时候,需要进行一次绑定操作。而Options模式提供了更直接的方式,并且可以通过依赖注入的方式提供配置的读取。下文中称每一条Options配置为Option。

1.简单的不为Option命名的方式

依然采用这个例子,在appsettings.json中存在这样的配置:

{ "Theme": { "Name": "Blue", "Color": "#0921DC" } }

修改一下ValueController,代码如下:

public class ValuesController : Controller { private IOptions<Theme> _options = null; public ValuesController(IOptions<Theme> options) { _options = options; } public ContentResult GetOptions() { return new ContentResult() { Content = $"options:{ _options.Value.Name}" }; } }

依然需要在Startup文件中做注册:

public void ConfigureServices(IServiceCollection services) { services.Configure<Theme>(Configuration.GetSection("Theme")); services.AddControllersWithViews(); //3.0中启用的新方法 }

请求这个Action,获取到的结果为:

options:Blue

这样就可以在需要使用该配置的时候通过依赖注入的方式使用了。但有个疑问,这里将“Theme”类型绑定了这样的配置,但如果有多个这样的配置呢?就如同下面这样的配置的时候:

"Themes": [ { "Name": "Blue", "Color": "#0921DC" }, { "Name": "Red", "Color": "#FF4500" } ]

在这样的情况下,存在多个Theme的配置,这样对于之前这种依赖注入的方式就不行了。这时系统提供了将注入的Options进行命名的方法。

2.为Option命名的方式

首先需要在Startup文件中注册的时候对其命名,添加如下两条注册代码:

services.Configure<Theme>("ThemeBlue", Configuration.GetSection("Themes:0")); services.Configure<Theme>("ThemeRed" , Configuration.GetSection("Themes:1"));

修改ValueController代码,添加IOptionsMonitor<Theme>和IOptionsSnapshot<Theme>两种新的注入方式如下:

private IOptions<Theme> _options = null; private IOptionsMonitor<Theme> _optionsMonitor = null; private IOptionsSnapshot<Theme> _optionsSnapshot = null; public ValuesController(IOptions<Theme> options, IOptionsMonitor<Theme> optionsMonitor, IOptionsSnapshot<Theme> optionsSnapshot) { _options = options; _optionsMonitor = optionsMonitor; _optionsSnapshot = optionsSnapshot; } public ContentResult GetOptions() { return new ContentResult() { Content = $"options:{_options.Value.Name}," + $"optionsSnapshot:{ _optionsSnapshot.Get("ThemeBlue").Name }," + $"optionsMonitor:{_optionsMonitor.Get("ThemeRed").Name}" }; }

请求这个Action,获取到的结果为:

options:Blue,optionsSnapshot:Red,optionsMonitor:Gray

新增的两种注入方式通过Options的名称获取到了对应的Options。为什么是两种呢?它们有什么区别?不知道有没有读者想到上一章配置的重新加载功能。在配置注册的时候,有个reloadOnChange选项,如果它被设置为true的,当对应的数据源发生改变的时候,会进行重新加载。而Options怎么能少了这样的特性呢。

3.Option的自动更新与生命周期

为了验证这三种Options的读取方式的特性,修改Theme类,添加一个Guid字段,并在构造方法中对其赋值,代码如下:

public class Theme { public Theme() { Guid = Guid.NewGuid(); } public Guid Guid { get; set; } public string Name { get; set; } public string Color { get; set; } }

修改上例中的名为GetOptions的Action的代码如下:

public ContentResult GetOptions() { return new ContentResult() { Content = $"options:{_options.Value.Name}|{_options.Value.Guid}," + $"optionsSnapshot:{ _optionsSnapshot.Get("ThemeBlue").Name }|{_optionsSnapshot.Get("ThemeBlue").Guid}," + $"optionsMonitor:{_optionsMonitor.Get("ThemeRed").Name}|{_optionsMonitor.Get("ThemeRed").Guid}" }; }

请求这个Action,返回结果如下:

options:Blue|ad328f15-254f-4505-a79f-4f27db4a393e,optionsSnapshot:Red|dba5f550-29ca-4779-9a02-781dd17f595a,optionsMonitor:Gray|a799fa41-9444-45dd-b51b-fcd15049f98f

刷新页面,返回结果为:

options:Blue|ad328f15-254f-4505-a79f-4f27db4a393e,optionsSnapshot:Red|a2350cb3-c156-4f71-bb2d-25890fe08bec,optionsMonitor:Gray|a799fa41-9444-45dd-b51b-fcd15049f98f

可见IOptions和IOptionsMonitor两种方式获取到的Name值和Guid值均未改变,而通过IOptionsSnapshot方式获取到的Name值未改变,但Guid值发生了改变,每次刷新页面均会改变。这类似前面讲依赖注入时做测试的例子,现在猜测Guid未改变的IOptions和IOptionsMonitor两种方式是采用了Singleton模式,而Guid发生改变的IOptionsSnapshot方式是采用了Scoped或Transient模式。如果在这个Action中多次采用IOptionsSnapshot读取_optionsSnapshot.Get("ThemeBlue").Guid的值,会发现同一次请求的值是相同的,不同请求之间的值是不同的,也就是IOptionsSnapshot方式使采用了Scoped模式(此验证示例比较简单,请读者自行修改代码验证)。

在这样的情况下,修改三种获取方式对应的配置项的Name值,例如分别修改为“Blue1”、“Red1”和“Gray1”,再次多次刷新页面查看返回值,会发现如下情况:

IOptions方式:Name和Guid的值始终未变。Name值仍为Blue。

IOptionsSnapshot方式:Name值变为Red1,Guid值单次请求内相同,每次刷新之间不同。

IOptionsMonitor方式:只有修改配置值后第一次刷新的时候将Name值变为了Gray1,Guid未改变。之后多次刷新,这两个值均未做改变。

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读