.NET Core 选项模式【Options】的使用
ASP.NET Core引入了Options模式,使用类来表示相关的设置组。简单的来说,就是用强类型的类来表达配置项,这带来了很多好处。利用了系统的依赖注入,并且还可以利用配置系统。它使我们可以采用依赖注入的方法直接使用绑定的一个POCO对象,这个POCO对象就叫做Options对象。也可以叫做配置对象。
以下大多内容来自官方文档,我只是个翻译官或者叫搬运工吧!
引入Options扩展包
绑定分层配置
在appsetting.json文件增加如下配置
创建以下 PositionOptions 类:
选项类:
- 必须是包含公共无参数构造函数的非抽象类。
- 类型的所有公共读写属性都已绑定。
- 不会绑定字段。 在上面的代码中,Position 未绑定。 由于使用了 Position 属性,因此在将类绑定到配置提供程序时,不需要在应用中对字符串 "Position" 进行硬编码。
类绑定
调用 ConfigurationBinder.Bind 将 PositionOptions 类绑定到 Position 部分。然后就可以用了,当然这种方式在开发.NET Core种并不常用,一般采用依赖注入的方式注入。
使用 ConfigurationBinder.Get 可能比使用 ConfigurationBinder.Bind 更方便。
依赖项注入服务容器
- 修改ConfigureServices方法
- 通过使用前面的代码,以下代码将读取位置选项:
选项接口
初学者会发现这个框架有3个主要的面向消费者的接口:IOptions、IOptionsMonitor以及IOptionsSnapshot。
这三个接口初看起来很类似,所以很容易引起困惑,什么场景下该用哪个接口呢?
- IOptions
- 不支持
- 在应用启动后读取配置数据。
- 命名选项
- 注册为单一实例,可以注入到任何服务生存期。
- IOptionsSnapshot
- 作用域容器配置热更新使用它
- 注册为范围内,因此无法注入到单一实例服务
- 支持命名选项
- IOptionsMonitor
- 用于检索选项并管理 TOptions 实例的选项通知。
- 注册为单一实例且可以注入到任何服务生存期。
- 支持
- 更改通知
- 命名选项
- 可重载配置
- 选择性选项失效
使用 IOptionsSnapshot 读取已更新的数据
IOptionsMonitor 和 IOptionsSnapshot 之间的区别在于:
- IOptionsMonitor 是一种单一示例服务,可随时检索当前选项值,这在单一实例依赖项中尤其有用。
- IOptionsSnapshot 是一种作用域服务,并在构造 IOptionsSnapshot 对象时提供选项的快照。 选项快照旨在用于暂时性和有作用域的依赖项。
IOptionsMonitor
命名选项支持使用 IConfigureNamedOptions
命名选项:
- 当多个配置节绑定到同一属性时有用。
- 区分大小写。
appsettings.json文件
下面的类用于每个节,而不是创建两个类来绑定 TopItem:Month 和 TopItem:Year
依赖注入容器
服务应用
使用 DI 服务配置选项
在配置选项时,可以通过以下两种方式通过依赖关系注入访问服务:
- 将配置委托传递给 OptionsBuilder 上的 Configure
- 创建实现 IConfigureOptions 或 IConfigureNamedOptions 的类型,并将该类型注册为服务
建议将配置委托传递给 Configure,因为创建服务较复杂。 在调用 Configure 时,创建类型等效于框架执行的操作。 调用 Configure 会注册临时泛型 IConfigureNamedOptions,它具有接受指定的泛型服务类型的构造函数。
选项验证
appsettings.json 文件
下面的类绑定到 "MyConfig" 配置节,并应用若干 DataAnnotations 规则:
- 启用DataAnnotations验证
使用IValidateOptions更复杂的配置
