一.概述
本章讲的选项模式是对Configuration配置的功能扩展。 讲这篇时有个专用名词叫“选项类(TOptions)” 。该选项类作用是指:把选项类中的属性与配置来源中的键关联起来。举个例,假设json文件有个Option1键,选项类中也有个叫Option1的属性名,经过选项配置,这样就能把json中的键的值映射到选项类属性值中。也可以理解在项目应用中,把一个json文件序列化到.net类。
1.1选项接口介绍
在官方文档中选项接口有很多,这里列举了这些选项接口。所有选项接口基本都继承了TOptions接口。
View Code
(1) IOptionsMonitor<TOptions>
IOptionsMonitor<TOptions>用于TOptions实例更改时的通知,用于管理 TOptions选项类 。该IOptionsMonitor<TOptions>支持以下方案:
(1) 更改通知。当配置文件发生修改时,会监听同步到选项类。
(2) 命名选项。IConfigureNamedOptions支持命名选项。接口继续关系 IConfigureNamedOptions:IConfigureOptions
(3) 重新加载配置。通过 IOptionsSnapshot 重新加载配置数据,IOptionsMonitor也支持该功能。 接口继续关系IOptionsSnapshot :IOptions
(4) 选择性选项失效 (IOptionsMonitorCache<TOptions>)。
(2) 其它接口
IOptionsFactory<TOptions> 负责产生TOptions选项实例,它具有单个 Create 方法。
默认实现采用所有已注册 IConfigureOptions<TOptions> 和 IPostConfigureOptions<TOptions> 并首先运行所有配置(所有的来源配置),
然后才进行选项后期配置IPostConfigureOptions<TOptions> 。
IOptionsMonitorCache<TOptions>用于缓存TOptions实例。
1.2 常规选项配置
TOptions选项类必须为包含公共无参数构造函数的非抽象类。下面示例中选项类MyOptions具有两种属性:Option1 和 Option2。 设置默认值为可选,但以下示例中的类构造函数设置了 Option1 的默认值。 Option2 具有通过直接初始化属性设置的默认值。
public class MyOptions { public MyOptions() { // Set default value. Option1 = "value1_from_ctor"; } public string Option1 { get; set; } public int Option2 { get; set; } = 5; }
//将MyOptions类已通过Configure添加到服务容器,并绑定到配置IConfiguration上 //Registers a configuration instance which TOptions will bind against. services.Configure<MyOptions>(Configuration);
private readonly MyOptions _options;
//OtherPages/Page1 public Page1Model( IOptionsMonitor<MyOptions> optionsAccessor) { _options = optionsAccessor.CurrentValue; } public void OnGet() { var option1 = _options.Option1; var option2 = _options.Option2; var SimpleOptions = $"option1 = {option1}, option2 = {option2}"; }
// 此时SimpleOptions值:"option1 = value1_from_ctor, option2 = 5"
//下面在appsettings.json 文件添加 option1 和 option2 的值。 "option1": "value1_from_json

