一.概述
本章讲的选项模式是对Configuration配置的功能扩展。 讲这篇时有个专用名词叫“选项类(TOptions)” 。该选项类作用是指:把选项类中的属性与配置来源中的键关联起来。举个例,假设json文件有个Option1键,选项类中也有个叫Option1的属性名,经过选项配置,这样就能把json中的键的值映射到选项类属性值中。也可以理解在项目应用中,把一个json文件序列化到.net类。
1.1选项接口介绍
在官方文档中选项接口有很多,这里列举了这些选项接口。所有选项接口基本都继承了TOptions接口。
// Used for notifications when TOptions instances change public interface IOptionsMonitor<out TOptions> { // // 摘要: // Returns the current TOptions instance with the Microsoft.Extensions.Options.Options.DefaultName. TOptions CurrentValue { get; } //... }</span><span style="color:#008000;">//</span><span style="color:#008000;"> Used to create TOptions instances</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IOptionsFactory<TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span>, <span style="color:#0000ff;">new</span><span style="color:#000000;">() { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Returns a configured TOptions instance with the given name.</span> TOptions Create(<span style="color:#0000ff;">string</span><span style="color:#000000;"> name); } </span><span style="color:#008000;">//</span><span style="color:#008000;"> Represents something that configures the TOptions type. Note: These are run before all </span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IConfigureOptions<<span style="color:#0000ff;">in</span> TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span><span style="color:#000000;"> { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Invoked to configure a TOptions instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 参数: </span><span style="color:#008000;">//</span><span style="color:#008000;"> options: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The options instance to configure.</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> Configure(TOptions options); } </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IPostConfigureOptions<<span style="color:#0000ff;">in</span> TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span><span style="color:#000000;"> { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Invoked to configure a TOptions instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 参数: </span><span style="color:#008000;">//</span><span style="color:#008000;"> name: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The name of the options instance being configured. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> options: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The options instance to configured.</span> <span style="color:#0000ff;">void</span> PostConfigure(<span style="color:#0000ff;">string</span><span style="color:#000000;"> name, TOptions options); } </span><span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IConfigureNamedOptions<<span style="color:#0000ff;">in</span> TOptions> : IConfigureOptions<TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span><span style="color:#000000;"> { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Invoked to configure a TOptions instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 参数: </span><span style="color:#008000;">//</span><span style="color:#008000;"> name: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The name of the options instance being configured. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> options: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The options instance to configure.</span> <span style="color:#0000ff;">void</span> Configure(<span style="color:#0000ff;">string</span><span style="color:#000000;"> name, TOptions options); } </span><span style="color:#008000;">//</span><span style="color:#008000;"> Used by IOptionsMonitor<TOptions> to cache TOptions instances.</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IOptionsMonitorCache<TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span><span style="color:#000000;"> { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Clears all options instances from the cache.</span> <span style="color:#0000ff;">void</span><span style="color:#000000;"> Clear(); </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Gets a named options instance, or adds a new instance created with createOptions. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 参数: </span><span style="color:#008000;">//</span><span style="color:#008000;"> name: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The name of the options instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> createOptions: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The func used to create the new instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 返回结果: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The options instance.</span> TOptions GetOrAdd(<span style="color:#0000ff;">string</span> name, Func<TOptions><span style="color:#000000;"> createOptions); </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Tries to adds a new option to the cache, will return false if the name already </span><span style="color:#008000;">//</span><span style="color:#008000;"> exists. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 参数: </span><span style="color:#008000;">//</span><span style="color:#008000;"> name: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The name of the options instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> options: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The options instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 返回结果: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Whether anything was added.</span> <span style="color:#0000ff;">bool</span> TryAdd(<span style="color:#0000ff;">string</span><span style="color:#000000;"> name, TOptions options); </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Try to remove an options instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 参数: </span><span style="color:#008000;">//</span><span style="color:#008000;"> name: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The name of the options instance. </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 返回结果: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Whether anything was removed.</span> <span style="color:#0000ff;">bool</span> TryRemove(<span style="color:#0000ff;">string</span><span style="color:#000000;"> name); } </span><span style="color:#008000;">//</span><span style="color:#008000;"> Used to access the value of TOptions for the lifetime of a request</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IOptionsSnapshot<<span style="color:#0000ff;">out</span> TOptions> : IOptions<TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span>, <span style="color:#0000ff;">new</span><span style="color:#000000;">() { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> Returns a configured TOptions instance with the given name.</span> TOptions Get(<span style="color:#0000ff;">string</span><span style="color:#000000;"> name); } </span><span style="color:#008000;">//</span><span style="color:#008000;">Used to retrieve configured TOptions instances</span> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">interface</span> IOptions<<span style="color:#0000ff;">out</span> TOptions> <span style="color:#0000ff;">where</span> TOptions : <span style="color:#0000ff;">class</span>, <span style="color:#0000ff;">new</span><span style="color:#000000;">() { </span><span style="color:#008000;">//</span> <span style="color:#008000;">//</span><span style="color:#008000;"> 摘要: </span><span style="color:#008000;">//</span><span style="color:#008000;"> The default configured TOptions instance</span> TOptions Value { <span style="color:#0000ff;">get</span><span style="color:#000000;">; } }</span></pre> </div> <span class="cnblogs_code_collapse">View Code</span> </div> <p> </p> <p> (1) IOptionsMonitor<TOptions></p> <p> IOptionsMonitor<TOptions>用于TOptions实例更改时的通知,用于管理 TOptions选项类 。该IOptionsMonitor<TOptions>支持以下方案:</p> <p> (1) 更改通知。当配置文件发生修改时,会监听同步到选项类。</p> <p> (2) 命名选项。IConfigureNamedOptions支持命名选项。接口继续关系 IConfigureNamedOptions:IConfigureOptions</p> <p> (3) 重新加载配置。通过 IOptionsSnapshot 重新加载配置数据,IOptionsMonitor也支持该功能。 接口继续关系IOptionsSnapshot :IOptions</p> <p> (4) 选择性选项失效 (IOptionsMonitorCache<TOptions>)。</p> <p> (2) 其它接口</p> <p> IOptionsFactory<TOptions> 负责产生TOptions选项实例,它具有单个 Create 方法。</p> <p> 默认实现采用所有已注册 IConfigureOptions<TOptions> 和 IPostConfigureOptions<TOptions> 并首先运行所有配置(所有的来源配置),</p> <p> 然后才进行选项后期配置IPostConfigureOptions<TOptions> 。</p> <p> IOptionsMonitorCache<TOptions>用于缓存TOptions实例。</p> <p> </p> <p> <strong> 1.2 常规选项配置</strong></p> <p> TOptions选项类必须为包含公共无参数构造函数的非抽象类。下面示例中选项类MyOptions具有两种属性:<code>Option1</code> 和 <code>Option2</code>。 设置默认值为可选,但以下示例中的类构造函数设置了 <code>Option1</code> 的默认值。 <code>Option2</code> 具有通过直接初始化属性设置的默认值。</p> <div class="cnblogs_code"> <pre> <span style="color:#0000ff;">public</span> <span style="color:#0000ff;">class</span><span style="color:#000000;"> MyOptions