分类
国外评最佳外汇经纪商

关注ioption动向

09-14 68

【5min+】更好的选项实践。.Net Core中的IOptions

x

所以来举个例子,在AspNet Core中咱们某个选项的值是根据一个文件的某个值来的。刚开始文本的值是“A”,咱们在运行AspNet 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 关注ioption动向 这个令牌源,目前.net core对很多常用工具都实现了该令牌源,比如Logger,Configuration等。所以当我们某个选项依赖于 IConfiguration (appsetting.json)的某一项时,当修改appsetting.json文件,该选项的值就能够立马得到更改。

类型 说明 时效性
IOptions 一旦程序启动,该选项的值就无法更改 无时效性可言
IOptionsSnapshot 当开启一个新Scoped时,就会重新计算选项的值 相对比较低,依赖于合适开启一个新的Scoped
IOptionsMonitor 依赖于IChangeToken,只要令牌源变更则立刻做出反应

假如把 IOptionsMonitor 添加到上面 IOptions 和 IOptionsSnapshot 的文件变更案例,如果在一次HTTP请求中,文件变更了两次,那么 IOptionsSnapshot 关注ioption动向 不会在第二次更改中同步更改,而 IOptionsMonitor 则可以。

那么什么时候来使用什么样的接口呢?相信这个时候,您的心里比我还要清楚。当您的选项只是负责一次性处理的时候,应用启动了就不需要更改,那么考虑使用 IOptions ,如果是对数据源的变更要求很严格,比如开启了一个“BackgroundJob”在后台运行,该job需要一个选项类型,而该类型依赖于配置文件,需要对配置文件更改时即刻做出改变,那么请考虑使用 IOptionsMonitor 。

x

最后回过头来看微软官方文档上关于“Options”的两个点(ISP和关注点分离),您应该一下就能理解。

ASP.关注ioption动向 NET Core 源码学习之 Options[4]:IOptionsMonitor

dotNET跨平台 于 2017-08-11 07:16:04 发布 852 收藏

前面我们讲到 IOptions 和 IOptionsSnapshot,他们两个最大的区别便是前者注册的是单例模式,后者注册的是 Scope 模式。而 IOptionsMonitor 则要求配置源必须是可监听的,用来实现 Options 实例的自动更新,并对外提供了 OnChage 事件,给我们更多的控制权。

IOptionsMonitor

IOptionsMonitorIOptionsSnapshot 类似,都提供了根据指定名称获取 Options 的功能,并多了一个 OnChange 方法。而它的默认实现者是 OptionsMonitor

OptionsMonitor

首先看构造函数中的三个参数,其中 IOptionsFactory<> 关注ioption动向 和 IOptionsMonitorCache<> 在上一章已讲过,而第二个 IOptionsChangeTokenSource<> 则是用来实现对配置源的监听:

通过 GetChangeToken 获取 ChangeToken , 从而注册其 InvokeChanged 关注ioption动向 方法:

首先移除 Options 缓存,再通过 IOptionsFactory 重新创建 Options,然后调用 _onChange 事件。

OnChange 方法则用来注册 _onChange 事件:

这里又使用了一个 OptionsMonitore 的包装类,用来实现事件的注销:

再去看一下 IConfigurationChangeTokenSource 的实现

ConfigurationChangeTokenSource

IConfigurationChangeTokenSource 的默认实现类便是 ConfigurationChangeTokenSource<> :

ConfigurationChangeTokenSource 构造函数要求传入 IConfiguration,其而 ChangeToken 的获取便是通过 IConfiguration 来得到的:

因此要想使用 IOptionsMonitor,必须要使用 IConfiguration 进行注册才可以,当然,你也可以实现自己的 ChangeToken 。

本章介绍了 IOptionsMonitor 的实现:通过 IConfiguration 所提供的 ChangeToken ,来注册监听事件,对其 CurrentValue 进行更新。到此,ASP.NET Core 关注ioption动向 中的 Options 源码也就分析完了,其本身比较简单,并没有太多东西。更具体的可以去 Github 上看完整的源码,而 .NET Core 才刚刚发布了 Preview2 版本,随时可能会有大的变化,而我也会保持更新,通过观察每次的变化,也能学到更多的编程思想,也是一件很快乐的事。

.net core中IOption的用法

风神修罗使 于 2022-03-16 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

简单理解就是获取配置文件得 关注ioption动向 首先写好配置文件 "Demo": < "Age": 18, "Name": "Fengleibiao" >然后创建好类 public class Demo < public int Age < get; set; >public string Name < get; set; >> 其次在startup.cs文件注入 public void ConfigureServices(关注ioption动向 .

11-13 366

12-04 98

前言 上一篇文章介绍IOptions注册,本章我们继续往下看 IOptions IOptions是一个接口里面只有一个Values属性,该接口通过OptionsManager实现 public interface IOptionsOptions> where TOptions : class, new() < /// ...

08-09 607

在 上一篇 ,介绍了一下Options注册,而使用时只需要注入 关注ioption动向 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 特点: 非抽象类 必须包含公共无参构造函数 类所有公共读写属性都会与配置项进行绑定 字段不会被绑定 接下来,为了便于理解,先举个例子: 首先在 关注ioption动向 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号