options补充

前言
.NET Core 引入了Options模式,使用强类型的类来表达配置项,提供了三种在不同场景下的使用接口:

IOptions
IOptionsSnapshot
IOptionsMonitor
但是常常不知道什么时候使用哪种方式才最合适,接下来我就用代码详细解读一下三种接口

代码示例
前期准备
首先新建.NET Core API项目来进行代码测试

DemoOptions 用来接收配置的强类型

options补充_第1张图片

options补充_第2张图片
在 Startup 中绑定配置和以 Singleton 模式注入测试的服务

 options补充_第3张图片


详解IOptions
修改 DemoService代码如下:

 options补充_第4张图片

跑起来代码结果如下,很方便的获取到配置项

options补充_第5张图片

尝试修改 appsetting.json 文件配置,重新请求一下接口,可以配置还是未修改之前的

options补充_第6张图片

options补充_第7张图片
很容看出,IOptions 可以注入到任何依赖注入周期,但是应用启动后无法读取修改的配置

详解IOptionsSnapshot
接着上面的代码,配置文件还原,修改 DemoService代码如下:

options补充_第8张图片

直接启动项目,发现程序启动报错。错误可以看出 IOptionsSnapshot 接口并不支持 Singleton 模式注入。options补充_第9张图片

修改为 Scoped 、 Transient 注入模式可以正常运行

接下来试试修改 appsetting.json 文件配置,重新请求接口结果如下

options补充_第10张图片

可以看出 IOptionsSnapshot 不支持以Singleton模式注入,但是Transient,Scoped 模式可以正常注入,同时应用启动后可以读取修改的配置

详解IOptionsMonitor
接着上面代码,配置文件还原,继续修改 DemoService 如下:

options补充_第11张图片

很明显看出 IOptionsMonitor 与 IOptions、IOptionsSnapshot 字段略有不同,F12 看看接口定义

options补充_第12张图片

除了获取当前Value 值之外,还提供了 Get、OnChange 两个方法,OnChange 方法可以监听配置的变化,修改DemoService 如下:

options补充_第13张图片

三种注入模式启动

同样修改 appsetting.json 文件配置,保存但不去请求接口,可以看到 OnChang 事件已监听到了改动。

接下来重新请求接口,可以看到修改之后的输出

得出结论 IOptionsMonitor 支持以Singleton、Transient,Scoped 模式注入,同时提供 OnChange 方法监听修改。

总结
结合以上示例可以清楚的分别三种接口的差别

IOptions
应用启动后无法读取修改的配置
可以注入到任何依赖注入周期
IOptionsSnapshot
应用启动后可以读取修改的配置
不支持以Singleton模式注入,Transient,Scoped 可以正常注入
IOptionsMonitor
应用启动后可以读取修改的配置
Singleton,Transient,Scoped 三种注入周期都可以正常注入
同时提供 OnChange() 方法监听配置变更

 

你可能感兴趣的:(c#,开发语言)