前言

记录下最近在成都的面试题, 选项模式的热更新, 没答上来

正文

选项模式的依赖注入共有三种接口, 分别是 IOptions<>, IOptionsSnapshot<>, IOptionsMonitor<>, 它们内部都实现了缓存,所以注入后除了第一次调用之外都是从缓存中直接取.

其中 IOptions<>, IOptionsMonitor<> 都注册成了单例, IOptionsSnapshot<> 注册成了作用域

services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions<>), typeof(OptionsManager<>)));
services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot<>), typeof(OptionsManager<>)));
services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor<>), typeof(OptionsMonitor<>)));

IOptions<>

由于 IOptions<> 注册成了单例, 整个应用程序生命周期只会实例化一次, 选项值将会在第一次调用 .Value的时候加入缓存, 之后就不会再更新了

public interface IOptions<out TOptions> where TOptions : class
{
TOptions Value { get; }
}

OptionsManager

public class OptionsManager<TOptions> : IOptions<TOptions>, IOptionsSnapshot<TOptions> where TOptions : class
{
private readonly IOptionsFactory<TOptions> _factory;
private readonly OptionsCache<TOptions> _cache = new OptionsCache<TOptions>();
public OptionsManager(IOptionsFactory<TOptions> factory)
{
_factory = factory;
}
public TOptions Value
{
get
{
return Get(Options.DefaultName);
}
}
public virtual TOptions Get(string name)
{
name = name ?? Options.DefaultName;
return _cache.GetOrAdd(name, () => _factory.Create(name));
}
}

IOptionsSnapshot<>

可以看到 IOptions<>IOptionsSnapshot<> 的实现类都是 OptionsManager, 它们之间的区别就在于生命周期不同, IOptionsSnapshot<> 是作用域的所以它将在每一次请求重新被实例化, 选项值将会被重新获取

public interface IOptionsSnapshot<out TOptions> : IOptions<TOptions> where TOptions : class
{
TOptions Get(string name);
}

IOptionsMonitor<>

IOptionsMonitor<> 也是注册成单例的, 但是它会在选项改变时接收到通知, 从而更新缓存值, 使用者也可以注册监听器在选项变更后,做出对应的处理

public interface IOptionsMonitor<out TOptions>
{
TOptions CurrentValue { get; }
TOptions Get(string name);
IDisposable OnChange(Action<TOptions, string> listener);
}

总结

不需要热更新选项的时候注入 IOptions<>, 需要热更新和选项变更通知的注入 IOptionsMonitor<>, 仅需要热更新的注入 IOptionsSnapshot<> 缺点是每一次请求都会重新实例化, 传统发布不能停机的选用这个.

当然热更新需要 reloadOnChange: True.

Asp.Net Core 选项模式的三种注入方式的更多相关文章

  1. spring ioc三种注入方式

    spring ioc三种注入方式 IOC ,全称 (Inverse Of Control) ,中文意思为:控制反转 什么是控制反转? 控制反转是一种将组件依赖关系的创建和管理置于程序外部的技术. 由容 ...

  2. Spring IOC 三种注入方式

    1.    接口注入 2.    setter注入 3.    构造器注入 对象与对象之间的关系可以简单的理解为对象之间的依赖关系:A类需要B类的一个实例来进行某些操作,比如在A类的方法中需要调用B类 ...

  3. .NetCore中三种注入方式的思考

    该篇内容由个人博客点击跳转同步更新!转载请注明出处! .NetCore彻底诠释了"万物皆可注入"这句话的含义,在.NetCore中到处可见注入的使用.因此core中也提供了三种注入 ...

  4. Spring学习日记01_IOC_xml的三种注入方式

    什么是IOC 控制反转,把对象创建和对象之间的调用过程,交给Spring进行管理 使用IOC目的:为了耦合度降低 做入门案例就是IOC实现 IOC底层原理 xml解析 工厂模式 反射 原始方式 cla ...

  5. Spring IOC以及三种注入方式

    IOC是spring的最基础部分,也是核心模块,Spring的其他组件模块和应用开发都是以它为基础的.IOC把spring的面向接口编程和松耦合的思想体现的淋漓尽致. IOC概念 IOC(Invers ...

  6. Spring IOC 中三种注入方式

    项目错误知识点记录 正文 最近在项目的时候,用到Spring框架,Spring框架提供了一种IOC的自动注入功能,可以很轻松的帮助我们创建一个Bean,这样就省的我们四处写new Object()这样 ...

  7. Spring IOC 三种注入方式(构造器,setter,接口)

    Spring的依赖注入有三种方式: 1,构造器注入 2,setter注入 3,接口注入 下面我给大家介绍一下这三种注入 1.构造器注入 构造器注入主要是依赖于构造方法去实现,构造方法可以是有参也可以是 ...

  8. Spring的三种注入方式(Setter、构造函数和自动注入)

    一.Setter注入 这里我是希望在Student.java中调用Course.java中的内容. public class Course { public String name = "数 ...

  9. ASP.NET Core 选项模式源码学习Options Configure(一)

    前言 ASP.NET Core 后我们的配置变得更加轻量级了,在ASP.NET Core中,配置模型得到了显著的扩展和增强,应用程序配置可以存储在多环境变量配置中,appsettings.json用户 ...

随机推荐

  1. hbase运行流程图

    hbase运行流程图

  2. 3 Spark 集群安装

    第3章 Spark集群安装 3.1 Spark安装地址 1.官网地址 http://spark.apache.org/ 2.文档查看地址 https://spark.apache.org/docs/2 ...

  3. 启动tomcat出现闪退的原因

    出现闪退的可能有几点: 1.没有安装jdk或者配置jdk是否配置成功 2.找不到jdk安装的路径 3.tomcat环境配置失败 如果是第二点原因(确保第一第三点配置都正确无误)找不到jdk路径的话,可 ...

  4. lombook插件的说明

    lombok是一个可以帮助我们简化java代码编写的工具类,尤其是简化javabean的编写,即通过采用注解的方式,消除代码中的构造方法,getter/setter等代码,使我们写的类更加简洁,当然, ...

  5. Linux命令大纲

    LINUX服务器,广泛用于服务器的操作系统.本文以centos作为基础大概记录下自己的心得. 一.文件/目录的增删改查 1.增加 touch filename > filename mkdir ...

  6. php实现视频拍照上传头像功能实例代码

    如果要在php中实现视频拍照我们需要借助于flash插件了,由flash拍出的确照片我们再通过php的$GLOBALS ['HTTP_RAW_POST_DATA']接受数据,然后保存成图片就可以了,下 ...

  7. All in One 你想知道的 hacker 技术都在这里

    作者:HelloGitHub-小鱼干 hacker 这个词,大多数理解为黑客,而维基百科对其的定义为--黑客(Hacker)是指对设计.編程和计算机科学方面具高度理解的人,在本文中 hacker 主要 ...

  8. JavaSE基础--part1

    Java特性和优势 简单.面向对象.可移植性.高性能.分布式.动态性.多线程.安全性.健壮性 Java的三大版本 JavaSE 标准版(应用于桌面程序,控制台开发) JavaME 嵌入式开发(手机,小 ...

  9. 简单易懂的JS继承图解

    JS继承的实现方式一共有八种.下面我们来一个一个瞅一下.注意️:文章依据个人理解,难免有问题,还望各位及时指出!!!!! 原型链继承 借用构造函数继承 组合继承 原型式继承 寄生继承 寄生组合式继承 ...

  10. seo工程师是什么,需要什么技能?

    http://www.wocaoseo.com/thread-222-1-1.html      seo工程师是什么,SEO工程师是目前需求较大的一种职业,是搜索引擎营销的一种,主要是是通过网站优化技 ...