详解.NET Core 选项框架(Options)

前言

.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 如下:
在这里插入图片描述
很明显看出 IOptionsMonitorIOptions、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() 方法监听配置变更

另外不了解依赖注入三种注入模式的,可以查阅《详解.NET Core 依赖注入生命周期》

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

V-BOX

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值