ASP.NET Core - 选项系统之选项使用
上一个章节中 IOptions<TOptions>
、IOptionsMonitor<TOptions>
和 IOptionsSnapshot<TOptions>
三个接口,通过这三个接口都可以从依赖注入容器中解析出已经配置的选项类,在我们通过 Configure 方法配置选项时,这三个接口会被同时注册,但三个接口是有区别的,适用场景也有所不同。
下面详细讲解这三个类的使用方式和区别。
1. IOptions<TOptions>
IOptions<TOptions>
对象的生命周期是 Singleton (单例),它可以在任意地方进行注入使用- 该接口对象在第一次使用的时候被实例化,并且选项类中的内容会一直保持不变,前面也提过选项类内容可以在配置来源修改之后更新,但是通过
IOption<TOptions>
解析的选项类不会随着更新而改变 IOptions<TOptions>
接口不支持命名选项模式,它是没有 get 方法的,也并不会默认读取第一个,它只能读取 String.Empty 默认命名的选项,如果没有配置默认选项的话,虽然也能解析出Options选项类对象,但是对象的属性都是相应类型的默认值(引用类型是null,值类型是0,其他的也都是相应类型的默认值)
public class OptionController : ControllerBase
{
private readonly BlogOptions _blogOptions;
public OptionController(IOptions<BlogOptions> options)
{
// 通过 IOptions<TOptions> 接口的 Value 属性读取选项类
// 选项类始终是程序启动时加载的值,不会改变
_blogOptions = options.Value;
}
}
2. IOptionsSnapshot<TOptions>
IOptionsSnapshot<TOptions>
对象的生命周期是 Scoped(作用域),Scoped 生命周期的特点是不能注入到 Singleton 服务中- 在作用域中(最常见的一次Http请求),创建
IOptionsSnapshot<TOptions>
对象实例时,会从配置中读取最新选项值作为快照,并在当前作用域中始终使用该快照。也就是说一次请求中选项类内容保持不变,但是不同请求中可能因为配置来源的修改而不同 IOptionsSnapshot<TOptions>
支持命名选项
public class OptionController : ControllerBase
{
private readonly BlogOptions _blogOptions;
public OptionController(IOptionsSnapshot<BlogOptions> optionsSnapshot)
{
// IOptionsSnapshot<TOptions> 可以通过 Value 属性读取默认的命名的选项类, Options 对象实例创建时读取的配置快照
_blogOptions = optionsSnapshot.Value;
// 也可以通过 Get 方法获取某一个命名选项,没有指定命名时,默认命名为 string.Empty
//_blogOptions = optionsSnapshot.Get(string.Empty);
}
}
3. IOptionsMonitor<TOptions>
IOptionsMonitor<TO