前言
.NET Core 引入了Options模式,使用强类型的类来表达配置项,提供了三种在不同场景下的使用接口:
IOptions
IOptionsSnapshot
IOptionsMonitor
但是常常不知道什么时候使用哪种方式才最合适,接下来我就用代码详细解读一下三种接口
代码示例
前期准备
首先新建.NET Core API项目来进行代码测试
DemoOptions 用来接收配置的强类型
在 Startup 中绑定配置和以 Singleton 模式注入测试的服务
详解IOptions
修改 DemoService代码如下:
跑起来代码结果如下,很方便的获取到配置项
尝试修改 appsetting.json 文件配置,重新请求一下接口,可以配置还是未修改之前的
很容看出,IOptions 可以注入到任何依赖注入周期,但是应用启动后无法读取修改的配置
详解IOptionsSnapshot
接着上面的代码,配置文件还原,修改 DemoService代码如下:
直接启动项目,发现程序启动报错。错误可以看出 IOptionsSnapshot 接口并不支持 Singleton 模式注入。
修改为 Scoped 、 Transient 注入模式可以正常运行
接下来试试修改 appsetting.json 文件配置,重新请求接口结果如下
可以看出 IOptionsSnapshot 不支持以Singleton模式注入,但是Transient,Scoped 模式可以正常注入,同时应用启动后可以读取修改的配置
详解IOptionsMonitor
接着上面代码,配置文件还原,继续修改 DemoService 如下:
很明显看出 IOptionsMonitor 与 IOptions、IOptionsSnapshot 字段略有不同,F12 看看接口定义
除了获取当前Value 值之外,还提供了 Get、OnChange 两个方法,OnChange 方法可以监听配置的变化,修改DemoService 如下:
三种注入模式启动
同样修改 appsetting.json 文件配置,保存但不去请求接口,可以看到 OnChang 事件已监听到了改动。
接下来重新请求接口,可以看到修改之后的输出
得出结论 IOptionsMonitor 支持以Singleton、Transient,Scoped 模式注入,同时提供 OnChange 方法监听修改。
总结
结合以上示例可以清楚的分别三种接口的差别
IOptions
应用启动后无法读取修改的配置
可以注入到任何依赖注入周期
IOptionsSnapshot
应用启动后可以读取修改的配置
不支持以Singleton模式注入,Transient,Scoped 可以正常注入
IOptionsMonitor
应用启动后可以读取修改的配置
Singleton,Transient,Scoped 三种注入周期都可以正常注入
同时提供 OnChange() 方法监听配置变更