【5min+】更好的选项实践。.Net Core中的IOptions
所以来举个例子,在AspNet Core中咱们某个选项的值是根据一个文件的某个值来的。刚开始文本的值是“A”,咱们在运行AspNet 关注ioption动向 Core之后我们获取 IOptions 和 IOptionsSnapshot ,此时得到的 MyOptions 的该属性的值都是"A"。但是假如我们更改了文本的值,改为“B”。如果在发起一个http请求去获取 MyOptions 的结果,此时 IOptions 依旧是“A”,而 IOptionsSnapshot 则更改为了B。
原因很简单,因为 IOptions 是单例的,所以从程序一开始加载过一次之后,以后访问它都是这个结果,而 IOptionsSnapshot 是Scoped级别的,所以每一个新的Scoped时都会又去访问文本文件获取值,而一次Http请求就会开启一次新的Scoped,所以此时结果就成为“B”。这个时候我们大概就能读懂上面 IOptionsSnapshot<> 接口的解释了:“用于在请求的生存期内访问选项的值”。
三兄弟一下就干掉了俩,接下来看看最后一个好兄弟(毒瘤): IOptionsMonitor 。还是直接看它的源代码呢:
可以看出它自己是一个单独的接口,并不像其它俩兄弟是继承关系。而且该接口居然有一个 OnChange 签名?而且该方法需要一个 Action 的参数。
再看看该接口的说明:"Used for notifications when TOptions instances change."(用于在选项实例更改时进行通知)。果然和我们猜的一模一样,那么它的实现类里面一定有咱们上一篇文章中提到的: ChangeToken 和 IChangeToken 等东西。
意料之中,也就是说 IOptionsMonitor<> 的注入级别虽然是单例,但是因为它具有 IChangeToken 的实现,所以它能够在选项源改变的时候,“立马对选项做出对应的改变”。而改变依赖于 IOptionsChangeTokenSource 这个令牌源,目前.net core对很多常用工具都实现了该令牌源,比如Logger,Configuration等。所以当我们某个选项依赖于 IConfiguration (appsetting.json)的某一项时,当修改appsetting.json文件,该选项的值就能够立马得到更改。
类型 | 说明 | 时效性 |
---|---|---|
IOptions | 一旦程序启动,该选项的值就无法更改 | 无时效性可言 |
IOptionsSnapshot | 当开启一个新Scoped时,就会重新计算选项的值 | 相对比较低,依赖于合适开启一个新的Scoped |
IOptionsMonitor | 依赖于IChangeToken,只要令牌源变更则立刻做出反应 | 高 |
假如把 IOptionsMonitor 添加到上面 IOptions 和 IOptionsSnapshot 的文件变更案例,如果在一次HTTP请求中,文件变更了两次,那么 IOptionsSnapshot 不会在第二次更改中同步更改,而 IOptionsMonitor 则可以。
那么什么时候来使用什么样的接口呢?相信这个时候,您的心里比我还要清楚。当您的选项只是负责一次性处理的时候,应用启动了就不需要更改,那么考虑使用 IOptions ,如果是对数据源的变更要求很严格,比如开启了一个“BackgroundJob”在后台运行,该job需要一个选项类型,而该类型依赖于配置文件,需要对配置文件更改时即刻做出改变,那么请考虑使用 IOptionsMonitor 。
最后回过头来看微软官方文档上关于“Options”的两个点(ISP和关注点分离),您应该一下就能理解。
ASP.NET Core 源码学习之 Options[4]:IOptionsMonitor
dotNET跨平台 于 2017-08-11 07:16:04 发布 852 收藏
前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式。而 IOptionsMonitor 则要求配置源必须是可监听的,用来实现 Options 实例的自动更新,并对外提供了 OnChage 事件,给我们更多的控制权。
IOptionsMonitor
IOptionsMonitor 与 IOptionsSnapshot 类似,都提供了根据指定名称获取 Options 的功能,并多了一个 OnChange 方法。而它的默认实现者是 OptionsMonitor。
OptionsMonitor
首先看构造函数中的三个参数,其中 IOptionsFactory<> 和 IOptionsMonitorCache<> 在上一章已讲过,而第二个 IOptionsChangeTokenSource<> 则是用来实现对配置源的监听:
通过 GetChangeToken 获取 ChangeToken , 从而注册其 InvokeChanged 方法:
首先移除 Options 缓存,再通过 IOptionsFactory 重新创建 Options,然后调用 _onChange 事件。
而 OnChange 方法则用来注册 _onChange 事件:
这里又使用了一个 OptionsMonitore 的包装类,用来实现事件的注销:
再去看一下 IConfigurationChangeTokenSource 的实现
ConfigurationChangeTokenSource
IConfigurationChangeTokenSource 的默认实现类便是 ConfigurationChangeTokenSource<> :
ConfigurationChangeTokenSource 构造函数要求传入 IConfiguration,其而 ChangeToken 的获取便是通过 IConfiguration 来得到的:
因此要想使用 IOptionsMonitor,必须要使用 IConfiguration 进行注册才可以,当然,你也可以实现自己的 ChangeToken 关注ioption动向 。
本章介绍了 IOptionsMonitor 的实现:通过 IConfiguration 所提供的 ChangeToken ,来注册监听事件,对其 CurrentValue 进行更新。到此,ASP.NET Core 中的 Options 源码也就分析完了,其本身比较简单,并没有太多东西。更具体的可以去 Github 上看完整的源码,而 .NET Core 才刚刚发布了 Preview2 版本,随时可能会有大的变化,而我也会保持更新,通过观察每次的变化,也能学到更多的编程思想,也是一件很快乐的事。
.net core中IOption的用法
风神修罗使 于 2022-03-16 关注ioption动向 01:16:06 发布 197 收藏
09-29 4590
这是一个让人头皮发麻,全身慎得慌的诡异bug,因为它不符合科学逻辑,违反常理。仿佛有一只黑手在恶意操控着,让前端工程师们觉得不可以思议,也无可奈何。 我们在做前端开发时, 对于下拉选一般都会有一个“全部”选项,value='',用于清空前面选择的值,这是在正常不过了,但这在vue就开始变得奇奇怪怪,逻辑狗屁不通。 下面我开始对这个诡异的bug进行解刨,分...
02-23 2162
ABAP SELECTI-OPTIONS 选择范围控制http://blog.chinaunix.net/u2/67664/article_84414.html 前一段时间写了一篇《SAP ABAP 开发中常用的方法总结》的文章,其中写到关于 SELECT-OPTIONS 的选择范围是没有办法控制的,一位网友给了评论,链接可以控制的网址,我查看了,也测试了,可以控制、>=、=、
12-24 368
简单理解就是获取配置文件得 首先写好配置文件 "Demo": < "Age": 18, "Name": "Fengleibiao" >然后创建好类 public class Demo < public int Age < get; set; >public string Name < get; set; >> 其次在startup.cs文件中注入 public void ConfigureServices(.
11-13 366
12-04 98
前言 上一篇文章介绍IOptions的注册,本章我们继续往下看 IOptions IOptions是一个接口里面只有一个Values属性,该接口通过OptionsManager实现 public interface IOptionsOptions> where TOptions : class, new() < /// ...
08-09 607
在 上一篇 中,介绍了一下Options的注册,而使用时只需要注入 IOption 即可: public ValuesController(IOptions options)< var opt = options.Value; > IOptions IOptions 定义非常简单,只有一个Value属性: public interface IOptionsout TOptio
04-20 207
08-23 472
09-14 68
06-26 115
08-10 886
2017-06-28 更新:OptionsSnapshot 已改为 OptionsManager 变更详情IOptionsCache 已改为 IOptionsMonitorCache 变更详情 在 上一章 中,介绍了 IOptions 的使用, 而我们知道,在 ConfigurationBuilder 的 AddJsonFile 中,有一个 reloadOnChange 参数,设置为 tru
06-13 48
12-17 627
11-15 310
Options绑定 上期我们已经聊过了配置(IConfiguration),今天我们来聊一聊Options,中文译为“选项”,该功能用于实现以强类型的方式对程序配置信息进行访问。 既然是强类型的方式,那么就需要定义一个Options类,该类: 推荐命名规则:Options 特点: 非抽象类 必须包含公共无参的构造函数 类中的所有公共读写属性都会与配置项进行绑定 字段不会被绑定 接下来,为了便于理解,先举个例子: 首先在 appsetting.json 中添加如下配置: < "B
03-31 100
1、前言 文件配置提供程序默认的给我们提供了ini、json、Xml等。都是读取不同格式的文件。文件配置提供程序支持文件可寻、必选、文件变更的监视。 2、读取配置文件 主要运用的包:需要Ini、xml的添加相关包就行。 这次依然使用 Core3.1 WebApi项目,在启动程序接口里面读取json配置文件,先看看json文件的格式。里面有很多嵌套的子元素。 < "Name": "wyy", "Age": 18, "QQ": "30119459", "CardInfo":.
09-26 88
关注ioption动向
本人编辑
©2022 Baidu 使用百度前必读 | 百科协议 | 隐私政策 | 百度百科合作平台 | 京ICP证030173号