4.2 选项
4.2.1 什么是选项
选项是 ASP.NET Core 推荐的动态读取配置的方式,这种方式将配置文件数据用一个强类型来托管,能够实现配置验证、默认值配置、实时读取等功能。
4.2.2 与配置的区别
选项实际上也是配置,但在后者的基础上添加了配置验证、默认值/后期配置设定及提供了多种接口读取配置信息,同时还支持供配置更改通知等强大灵活功能。
所以,除了一次性读取使用的配置以外,都应该选用 选项 替换 配置。
知识导航
有关配置说明可查看《4.1 配置》 章节。
4.2.3 选项的使用
假设我们需要在系统运行时获取系统名称、版本号及版权信息,这些信息可能随时变化而且需要在多个地方使用。这时就需要将这些信息配置起来。具体步骤如下:
4.2.3.1 配置 appsettings.json 信息
4.2.3.2 创建 AppInfoOptions 强类型类
温馨提示
建议所有选项类都应该以 Options 命名结尾。
另外,Fur 框架提供了非常灵活的注册选项服务的方法,只需要继承 IConfigurableOptions 接口即可,该接口位于 Fur.ConfigurableOptions 命名空间下。
4.2.3.3 注册 AppInfoOptions 服务
选项不同于配置,需在应用启动时注册
4.2.3.4 读取 AppInfoOptions 信息
在 Fur 框架中,提供了多种读取方式:
- 通过
App.GetOptions<TOptions>(jsonKey)读取(不推荐) - 通过依赖注入以下实例读取:
IOptions<TOptions>IOptionsSnapshot<TOptions>IOptionsMonitor<TOptions>
- 通过
App静态类提供的静态方法获取:App.GetOptions<TOptions>()App.GetOptionsMonitor<TOptions>()App.GetOptionsSnapshot<TOptions>()
- App.GetOptions<TOptions>(jsonKey)
- 依赖注入方式
- App.GetOptions<TOptions>()
特别注意
App.GetOptions<TOptions>(jsonKey) 静态方法 区别于没有参数的 App.GetOptions<TOptions>() 静态方法,前者实际上还是 配置,只不过做了强类型解析,后者则通过 IOptions<TOptions> 解析。
两者源码如下:
通过上述代码得知,为什么不推荐使用 App.GetOptions<TOptions>(jsonKey) 读取,因为这种方式无法应用选项验证、默认配置、更改通知等功能。
4.2.3.5 如何选择读取方式
- 如果选项需要在多个地方使用,则无论任何时候都不推荐使用
App.GetOptions<TOptions>(jsonKey) - 在可依赖注入类中,依赖注入
IOptions[Snapshot|Monitor]<TOptions>读取 - 在静态类/非依赖注入类中,选择
App.GetOptions[Snapshot|Monitor]<TOptions>()读取
4.2.4 选项接口说明
ASP.NET Core 应用提供了多种读取选项的接口:
IOptions<TOptions>:- 不支持:
- 在应用启动后读取配置数据
- 命名选项
- 注册为单一实例且可以注入到任何服务生存期
- 不支持:
IOptionsSnapshot<TOptions>:- 在每次请求时应重新计算选项的方案中有用
- 注册为范围内,因此无法注入到单一实例服务
- 支持命名选项
IOptionsMonitor<TOptions>:- 用于检索选项并管理 TOptions 实例的选项通知。
- 注册为单一实例且可以注入到任何服务生存期。
- 支持:
- 更改通知
- 命名选项
- 可重载配置
- 选择性选项失效
(IOptionsMonitorCache<TOptions>)
了解更多
想了解更多 选项接口 知识可查阅 ASP.NET Core - 选项 - 选项接口 小节。
4.2.5 选项自定义配置
我们知道,选项实际上需要和配置文件特定键值挂钩,那 Fur 是如何准确的找到配置文件中的键值的呢?
4.2.5.1 选项查找键流程
- 没有贴
[OptionsSettings]特性- 以
Options结尾,则去除Options字符串 - 否则返回
类名称
- 以
- 贴了
[OptionsSettings]特性- 如果配置了
JsonKey属性,则返回JsonKey的值 - 否则返回
类名称
- 如果配置了
- 无[OptionsSettings]
- 有[OptionsSettings]
- 以
Options结尾,则键名为:AppInfo
- 不以
Options结尾,则键名为:AppInfoSettings
4.2.6 [OptionsSettings] 说明
选项类可以通过 [OptionsSettings] 来配置查找路径值。
JsonKey:对应配置文件中的键,支持 分层键 字符串,参见:《4.2 配置 - 3.1.3 分层读取数据》PostConfigureAll:选项后期配置,默认false。ASP.NET Core - 选项 - 选项后期配置
4.2.7 选项验证
选项支持验证配置有效性,在 Fur 框架中,通过 services.AddConfigurableOptions<TOptions>() 注册选项默认启用了验证支持。
包括:
- 特性方式
DataAnnotations - 自定义复杂验证
IValidateOptions<TOptions>
- 特性方式
- 复杂验证
特别说明
IConfigurableOptions<TOptions, TOptionsValidation> 继承自 IConfigurableOptions<TOptions>,也就是自定义复杂验证默认具有 PostConfigure(TOptions options) 选项后期配置方法。关于《4.3.7 选项后期配置》将在下一小节说明。
4.2.8 选项后期配置
选项后期配置通俗一点来说,可以在运行时解析值或设定默认值/后期配置等。
在 Fur 框架中,配置选项后期配置很简单,只需要继承 IConfigurableOptions<TOptions 接口并实现 PostConfigure(TOptions options) 方法。
特别说明
IConfigurableOptions<TOptions, TOptionsValidation> 继承自 IConfigurableOptions<TOptions>,也就是自定义复杂验证默认具有 PostConfigure(TOptions options, IConfiguration configuration) 选项后期配置方法。
4.2.9 选项更改通知(热更新)
Fur 框架提供了非常简单且灵活的方式监听选项更改,也就是 appsettings.json 或 自定义配置文件发生任何更改都会触发处理方法。
使用非常简单,只需要继承 IConfigurableOptionsListener<TOptions> 接口并实现 void OnListener(TOptions options, IConfiguration configuration) 方法即可。
特别说明
IConfigurableOptionsListener<TOptions> 继承自 IConfigurableOptions<TOptions>。
4.2.10 选项的优缺点
优点
- 强类型配置
- 提供多种读取方式
- 支持热加载
- 支持设置默认值/后期配置
- 支持在运行环境中动态配置
- 支持验证配置有效性
- 支持更改通知
- 支持命名选项
缺点
- 需要定义对应类型
- 需要在启动时注册
4.2.11 反馈与建议
与我们交流
给 Fur 提 Issue。
了解更多
想了解更多 选项 知识可查阅 ASP.NET Core - 选项 章节。