目录 1,选项接口 2,注入配置与IOptions 3,IOptionsSnapshot 首先要了解 ASP.NET Core 中的配置,请点击这里了解:https://www.cnblogs.com > IOptionsMonitor<TOptions> 这三种方式都可以获取到配置,区别在于生命周期和文件监控等。 " } 再创建一个与之对应的模型类: public class TestModel { public string Title { get; set; } IOptionsSnapshot 的生命作用域是 scoped ,在一个请求周期内有效。 和 IOptionsMonitor 都可以检测到配置文件的更改,但是 IOptionsSnapshot 每次请求都是一个新的对象,而 IOptionsMonitor 是单例模式。
、IOptionsSnapshot的区别 时长为五分钟以内,建议先投币再上车观看? 进行注册时无法获取type等),但并不影响我们令接口与实现进行分离。 IOptions还有两个兄弟IOptionsMonitor和IOptionsSnapshot。光名字上长的就很像了,它们都还有类似于“Value”的属性来获取选项实例。 它俩的区别其实就是依赖注入的生命周期不同而已,为单例的IOptions意味着,只要您注入之后以后获取的都是同一个实例,而IOptionsSnapshot呢,作为Scoped级别,每再一个新的Scoped 它们的区别其实在于变更的时效性: 类型 说明 时效性 IOptions 一旦程序启动,该选项的值就无法更改 无时效性可言 IOptionsSnapshot 当开启一个新Scoped时,就会重新计算选项的值
2核2G云服务器 每月9.33元起,个人开发者专属3年机 低至2.3折
前言 .NET Core 引入了Options模式,使用强类型的类来表达配置项,提供了三种在不同场景下的使用接口: IOptions IOptionsSnapshot IOptionsMonitor 可以看出 IOptionsSnapshot 不支持以Singleton模式注入,但是Transient,Scoped 模式可以正常注入,同时应用启动后可以读取修改的配置。 很明显看出 IOptionsMonitor 与 IOptions、IOptionsSnapshot 字段略有不同,F12 看看接口定义: ? 总结 结合以上示例可以清楚的分别三种接口的差别 IOptions o应用启动后无法读取修改的配置 o可以注入到任何依赖注入周期 IOptionsSnapshot o应用启动后可以读取修改的配置 o 不支持以Singleton模式注入,Transient,Scoped 可以正常注入 IOptionsMonitor o应用启动后可以读取修改的配置 oSingleton,Transient,Scoped
一、设置配置文件实时生效 1.1 配置 在Program.cs的CreateHostBuilder()处增加加载配置文件的时候,reloadOnChange:true。 这样配置文件修改的时候,程序就会监听到文件发生变化,自动重新加载了。 IOptionsSnapshot<T> //站点启动后,每次获取到的值都是配置文件里的最新值 (加载配置时,reloadOnChange:true 必须为true) 注意: IOptionsMonitor <T> 和 IOptionsSnapshot<T> 的最大区别是前者可以被其他的Singleton Services使用而后者不可以, 因为前者被注册为Singleton 而后者是被注册为Scoped, 通过IOptionsMonitor<T>的方式是可以实现配置实时刷新的,而IOptionsSnapshot<T>启动就会报错。
绑定配置 PostConfiger可在Configer基础上继续配置 可通过IOptionsSnapshot或IOptionsMonitor根据配置名称读取配置项,未指定名称读取第一个注入的配置 IOptions 和IOptionsMonitor生命周期为Singleton,IOptionsSnapshot生命周期为Scope IOptionsMonitor可监听到配置文件变动去动态更新配置项 问题 IOptions ,IOptionsSnapshot,IOptionsMonitor 如何/何时注入、初始化 Options指定名称时内部是如何设置的 Options如何绑定的IConfiguration IOptionsMonitor = null) { //Configure中会判断传入Name的值与本身的Name值是否相同,不同则不执行Action //这解释了我们一开始的示例中 ,IOptionsSnapshot,IOptionsMonitor都是在AddOptions函数中注入的 Configure配置的选项配置委托最终会保存到ConfigureNamedOptions或NamedConfigureFromConfigurationOptions
16 | 选项数据热更新:让服务感知配置的变化 选项框架还有两个关键类型: 1、IOptionsMonitor 2、IOptionsSnapshot 场景: 1、范围作用域类型使用 IOptinsSnapshot 2、单例服务使用 IOptionsMonitor 通过代码更新选项: IPostConfigureOptions 延续上一节的代码,但是做一些特殊处理,之前注册 Order 服务用的是单例模式,这里改为 只需要把 IOptions 换成 IOptionsSnapshot 即可 IOptionsSnapshot<OrderServiceOptions> _options; public OrderService (IOptionsSnapshot<OrderServiceOptions> options) { ... } 这是因为我们的服务注册的是 Scoped 模式,并且使用 Snapshot 来读取配置 ... } Monitor 与 Snapshot 的定义略微有些不同,它获取值是需要用 CurrentValue 字段 public int ShowMaxOrderCount() {
在获取的时候有三种获取方式:IOptions<TOptions>,IOptionsMonitor<TOptions>,IOptionsSnapshot<TOptions>。 接下来我们看看 IOptions<TOptions>,IOptionsSnapshot<TOptions>,IOptionsMonitor<TOptions>是如何实现的,以及它们是如何实现配置源的动态更新 如果TOption需要监控或者整个程序有多个同类型的TOption,那么只能选择IOptionsMonitor<TOptions>或者IOptionsSnapshot<TOptions>。 当IOptionsMonitor<TOptions>和IOptionsSnapshot<TOptions>都可以选择时,如果Action<TOptions>是一个比较耗时的操作,那么建议使用IOptionsMonitor <TOptions>,反之选择IOptionsSnapshot<TOptions> 如果需要对配置源的更新做出反应时(不仅仅是配置对象TOptions本身的更新),那么只能使用IOptionsMonitor
3.Option的自动更新与生命周期 为了验证这三种Options的读取方式的特性,修改Theme类,添加一个Guid字段,并在构造方法中对其赋值,代码如下: public class Theme { 这类似前面讲依赖注入时做测试的例子,现在猜测Guid未改变的IOptions和IOptionsMonitor两种方式是采用了Singleton模式,而Guid发生改变的IOptionsSnapshot方式是采用了 总结:IOptions和IOptionsMonitor两种方式采用了Singleton模式,但区别在于IOptionsMonitor会监控对应数据源的变化,如果发生了变化则更新实例的配置值,但不会重新提供新的实例 系统启动阶段,依赖注入 上一节的例子中涉及到了三个接口IOptions、IOptionsSnapshot和IOptionsMonitor,那么就从这三个接口说起。 这就是IOptions和IOptionsSnapshot两种模式的处理机制,接下来看一下IOptionsMonitor模式,它对应的实现是OptionsMonitor。
IOptionsSnapshot<T>/ Options 当然,除了IOptions<T>,我们还可以使用IOptionsSnapshot<T>去注入配置对象: IOptionsSnapshot 为此,上述代码中我与IOptions做出对比,第一次请求数据两者相同,为初始值: //第 1 次请求 IOptions:name:Charles,age:18,profession:.NET Developer profession:.NET 开发者 IOptionsMonitor<T>/ Options 最后,除了IOptionsSnapshot,微软还提供了IOptionsMonitor,这位则是提供 “全天候”的配置监控服务,配置文件一改,它就立刻更新,请看下图: 我将三者做一对比,在读取前就通过代码更新配置文件,因为OptionsPattern是延迟读取的,所以在改之前使IOptionsSnapshot age:19,profession:.NET 开发者 IOptionsMonitor:name:宿春磊Charles,age:19,profession:.NET 开发者 第二次请求的时候,IOptionsSnapshot
这样只需要在控制器的构造函数中注入 IOptionsSnapshot<TOption> 参数即可, 代码如下: [ApiController] [Route("[controller]")] public services.AddScoped(serviceProvider => { var snapshot = serviceProvider.GetService<IOptionsSnapshot , 根据中间件创建处理连时创建一次全局实例, 所以只能通过注入 IOptionsMonitor<T> 来监听配置文件的修改情况, 示例代码如下: public class TestMiddleware private WeatherOption option; public TestMiddleware( RequestDelegate next, IOptionsMonitor Task Invoke(HttpContext context) 方法中, 直接获取 IOptionsSnapshot<T> 也是可以的, 代码如下: public async Task Invoke(
, 还可以得到环境变量配置 可以在 ConfigureAppConfiguration 中清除所有配置,再添加自己需要的配置,后面添加的配置会覆盖前面的配置 .ConfigureAppConfiguration Configuration.GetSection("MyOption").Bind(myOption); // 单例注入到全局中 services.AddSingleton(myOption); 在 ConfigController 中注入,与获取 IOptionsSnapshot 被注册为 scoped,支持为可命名的配置 IOptionsMonitor 被注册为 singletone,会被通知,支持重载配置,支持为可命名的配置 IOptions IOptionsSnapshot public ConfigController(IConfiguration configuration, IOptionsSnapshot<MyOption> myOption IOptionsMonitor public ConfigController(IConfiguration configuration, IOptionsMonitor<MyOption> myOption
services.AddOptions(); return new OptionsBuilder<TOptions>(services, name); } } 六、IOptions<TOptions>与IOptionsSnapshot ,而通过IOptionsSnapshot<TOptions>接口获取的Options对象则只能在当前请求上下文中保持一致。 这也是后者命名的由来,它表示针对当前请求的Options快照 。 下面通过一个实例来演示IOptions<TOptions>和IOptionsSnapshot<TOptions>之间的差异。 如果希望即使在同一个请求处理周期内也能及时应用最新的Options属性,就只能使用IOptionsMonitor<TOptions>服务来提供Options对象。 [ASP.NET Core 3框架揭秘] Options[7]: 与配置系统的整合
这种具名的Options对象由IOptionsSnapshot<TOptions>接口表示的服务提供。 Profile对象,可以利用作为依赖注入容器的IServiceProvider对象得到IOptionsSnapshot<TOptions>服务,并将用户名作为参数调用其Get方法得到对应的Profile 对于前面演示的两个实例来说,提供的Options对象都是由配置文件提供的数据绑定生成的,如果新的配置数据被重新加载之后能够提供与之匹配的Options对象,那么这将是最理想的编程模式,可以通过IOptionsMonitor 与之前不同的是,在利用IServiceProvider对象得到IOptionsMonitor<TOptions>服务之后,可以调用其OnChange方法注册的回调是一个Action<TOptions, Options的名称和承载的数据打印在控制台上,所以控制台上输出的内容总是与配置文件的内容同步。
有\的意义表示bin文件夹里的所有文件和文件夹;反之,bin文件夹里的所有文件和与bin同节的文件 一般都是使用Directory.GetCurrentDirectory()进行设置根目录,这里尝试了添加文件配置的时候四种方式都是可以的 <IdentityClientOption> optionsMonitor, IOptionsSnapshot<IdentityClientOption> optionsSnapshot 上面代码中可以看到使用了两种方式绑定: //这种方式任何生命周期注册都可以使用IOptions IOptionsSnapshot IOptionsMonitor services.AddOptions< >(defaultOption); 而使用IOptionsMonitor时使用CurrentValue,其他两个使用Value。 5.3 IOptionsSnapshot和IOptionsMonitor 由于我这里是控制台应用程序,我这里采用RegisterChangeCallback()方法来借助测试,通过更改后重新获取IUserAppService
与配置源的实时同步(匿名Options)(源代码) [604]Options与配置源的实时同步(具名Options)(源代码) [605]用代码方式初始化Options(匿名Options)(源代码 图2 根据用户名提取对应的Profile对象 [603]Options与配置源的实时同步(匿名Options) 前面演示的第一个实例利用JSON文件定义了一个单一Profile对象的信息,我们现在对它做相应的修改来演示如何监控这个 图3 及时提取新的Profile对象并应用到程序中(匿名Options) [604]Options与配置源的实时同步(具名Options) 具名Options同样可以采用类似的编程模式来。 如代码片段所示,在得到IOptionsMonitor<TOptions>服务之后,我们调用另一个OnChange方法重载注册了类型为Action<TOptions, String>的委托作为回调,该委托的第二个参数表示的正是在注册 在如下所示的代码片段中,我们通过类似的方式设置了两个用户(“foo”和“bar”)的信息,然后利用IOptionsSnapshot<Profile>服务将它们分别提取出来。
15 | 选项框架:服务组件集成配置的最佳实践 这一节讲解如何使用选项框架来处理服务和配置的关系 选项框架的特性: 1、支持单例模式读取配置 2、支持快照 3、支持配置变更通知 4、支持运行时动态修改选项值 在设计系统的时候需要遵循两个原则: 1、接口分离原则(ISP),我们的类不应该依赖它不使用的配置 2、关注点分离(SoC),不同组件、服务、类之间的配置不应相互依赖或耦合 建议: 1、为我们的服务设计 XXXOptions 2、使用 IOptions、IOptionsSnapshot、IOptionsMonitor作为服务构造函数的参数 这样会让我们更快的实现服务配置的各种能力 源码链接: https 200,说明配置与选项已经完成绑定 服务只依赖了 OrderServiceOptions,并没有依赖配置框架,也就是说服务只关心配置的值是什么,它并不关心配置的值从哪里来,解除了配置与服务之间的依赖 另外可以为所有的服务分别设计它们的 Options,这样服务之间的选项配置也都不会互相依赖
四、直接初始化Options对象 前面演示的几个实例具有一个共同的特征,即都采用配置系统来提供绑定Options对象的原始数据,实际上,Options框架具有一个完全独立的模型,可以称为Options模型 在如下所示的代码片段中,我们通过类似的方式设置了两个用户(foo和bar)的信息,然后利用IOptionsSnapshot<TOptions>服务将它们分别提取出来。 }; }) .BuildServiceProvider() .GetRequiredService<IOptionsSnapshot 在前面的演示中,我们利用依赖注入框架提供IOptions<TOptions>服务、IOptionsSnapshot<TOptions>服务和IOptionsMonitor<TOptions>服务,然后进一步利用它们来提供对应的 我们利用第6章介绍的配置系统来设置当前的承载环境,具体采用的是基于命令行参数的配置源。.
与 用在网页上都能使字体加粗,二者的不同是:是物理元素 ;是逻辑元素。 物理元素强调的是一种物理行为。 而可以从字面理解知道它是强调的意思,是逻辑标签,强调文档逻辑。 对于搜索引擎(SEO)来说,比重视的多。
大家好,又见面了,我是你们的朋友全栈君。 1、列类型区别 oracle:可变长度varchar2、浮点型number,小数浮点型number(m,n),可变二进制数据raw,大对象类型(存储无结构数据,最大4G)lob mysql:可变长度varchar transaction; 10、pl/sql 11、储存过程、函数(oracle多了关键词is) 12、游标 oracle:c%isopen 判断是否打开游标,c%rowcount 当前fetch得到的行 ,c%found 上次fetch得到的数据 c%notfound 与found相反 13、触发器 mysql:新数据表示(new) oracle:新数据表示(:new) 14、php连接数据库 mysql 如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
腾讯云神图·人脸融合通过快速精准地定位人脸关键点,将用户上传的照片与特定形象进行面部层面融合,使生成的图片同时具备用户与特定形象的外貌特征,支持单脸、多脸、选脸融合,满足不同的营销活动需求……
扫码关注腾讯云开发者
领取腾讯云代金券