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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值