当前位置: 首页 > 编程日记 > 正文

[Asp.net 5] Options-配置文件(2)

很久之前写过一篇介绍Options的文章,2016年再打开发现很多变化。增加了新类,增加OptionMonitor相关的类。今天就对于这个现在所谓的新版本进行介绍。

老版本的传送门([Asp.net 5] Options-配置文件之后昂的配置)。

首先上一个图:

*绿线是继承关系,蓝线是关联关系。

我们把上面切成2大部分。

Option部分

这部分分为俩部分,第一部分直接创建Options,该部分通过Options静态类创建一个OptionsWrapper类,之后将(IOptions,OptionsWrapper)进行注入。这部分是DI的实体注入,很简单,没有什么可说的,此处应用非常常见的“工厂模式”。

第二部分是将(IOptions,OptionsManager)进行注入。我们OptionsManager会使用IEnumerable<IConfigureOptions<TOptions>>作为参数,而内部返回的是OptionsCache类型的对象,此处应用非常常见的“代理模式

    internal class OptionsCache<TOptions> where TOptions : class, new(){private readonly Func<TOptions> _createCache;private object _cacheLock = new object();private bool _cacheInitialized;private TOptions _options;private IEnumerable<IConfigureOptions<TOptions>> _setups;public OptionsCache(IEnumerable<IConfigureOptions<TOptions>> setups){_setups = setups;_createCache = CreateOptions;}private TOptions CreateOptions(){var result = new TOptions();if (_setups != null){foreach (var setup in _setups){setup.Configure(result);}}return result;}public virtual TOptions Value{get{return LazyInitializer.EnsureInitialized(ref _options,ref _cacheInitialized,ref _cacheLock,_createCache);}}}
OptionsCache

此处附录OptionsCache代码,里面(IConfigureOptions,ConfigureOptions)已经进行注入了。而ConfigureOptions代码如下:

    public class ConfigureOptions<TOptions> : IConfigureOptions<TOptions> where TOptions : class{public ConfigureOptions(Action<TOptions> action){if (action == null){throw new ArgumentNullException(nameof(action));}Action = action;}public Action<TOptions> Action { get; private set; }public virtual void Configure(TOptions options){if (options == null){throw new ArgumentNullException(nameof(options));}Action.Invoke(options);}}
ConfigureOptions

而ConfigureOptions实际上只是对Action<TOptions>的封装吧了(这里是不是可以理解为适配器)。

*为什么要传递Action<T>进行配置?我的理解是因为延时性延时的概念就是,你做的修改不是立马生效,以至于配置的时候,我们都不用考虑先后顺序。

OptionsMonitor部分

OptionsMonitor是对Options的监视器。我决定这部分好像一个调度者模式??

IOptionsChangeTokenSource

OptionsMonitor代码如下:

    public class OptionsMonitor<TOptions> : IOptionsMonitor<TOptions> where TOptions : class, new(){private OptionsCache<TOptions> _optionsCache;private readonly IEnumerable<IConfigureOptions<TOptions>> _setups;private readonly IEnumerable<IOptionsChangeTokenSource<TOptions>> _sources;public OptionsMonitor(IEnumerable<IConfigureOptions<TOptions>> setups, IEnumerable<IOptionsChangeTokenSource<TOptions>> sources){_sources = sources;_setups = setups;_optionsCache = new OptionsCache<TOptions>(setups);}public TOptions CurrentValue{get{return _optionsCache.Value;}}public IDisposable OnChange(Action<TOptions> listener){var disposable = new ChangeTrackerDisposable();foreach (var source in _sources){Action<object> callback = null;IDisposable previousSubscription = null;callback = (s) =>{// The order here is important. We need to take the token and then apply our changes BEFORE// registering. This prevents us from possible having two change updates to process concurrently.//// If the token changes after we take the token, then we'll process the update immediately upon// registering the callback.var token = source.GetChangeToken();// Recompute the options before calling the watchers_optionsCache = new OptionsCache<TOptions>(_setups);listener(_optionsCache.Value);// Remove the old callback after its been firedvar nextSubscription = token.RegisterChangeCallback(callback, s);disposable.Disposables.Add(nextSubscription);disposable.Disposables.Remove(previousSubscription);previousSubscription = nextSubscription;};previousSubscription = source.GetChangeToken().RegisterChangeCallback(callback, state: null);disposable.Disposables.Add(previousSubscription);}return disposable;}}
OptionsMonitor

通过IOptionsChangeTokenSource的IChangeToken对象发出更改请求,之后Action<TOptions> listener进行数据更改。

Onchange方法,实现上就是每次调用都会创建一个新的IDisposable(ChangeTrackerDisposable),如此而已。

转载于:https://www.cnblogs.com/watermoon2/p/5119085.html

相关文章:

android-sdk-windows版本号下载

Android SDK 4.0.3 开发环境配置及执行 近期又装了一次最新版本号的ADK环境 眼下最新版是Android SDK 4.0.3 本文的插图和文本尽管是Android2.2的 步骤都是一样的&#xff0c;假设安装的过程中遇到什么问题&#xff0c;能够留言&#xff0c;我会尽快回复&#xff01; 系统环境的…

vs code搭建Django环境

在网上找了很多博客&#xff0c;看了vs code的官方文档&#xff0c;最终拼凑起来&#xff0c;终于搭建起来了djangode开发虚拟环境&#xff08;win10下&#xff09; 一、新建项目文件夹 F:\Python\temp\django_demo&#xff08;例子&#xff09; 二、在项目文件夹创建虚拟pytho…

Marvelous Designer衣袖设计教程

大小解压后&#xff1a;2.96G 持续时间3h 28m 包含项目文件 1280X720 MP4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 标题:技能分享——卓越设计师大师班(袖子) 信息: 在我的课程中&#xff0c;精彩设计师大师班(袖子)。在本课程中&…

Mybatis入门:1(Mybatis框架的环境搭建)

Mybatis框架的环境搭建 一.创建maven工程并导入坐标 导入坐标&#xff1a; <dependencies><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.4</version></dependency><d…

html表单的创建和css的构成

产品参数 <h2>LIFAair LA500参数表</h2><table><tr><td>测试数目</td><td>单位</td><td>数据</td></tr><tr><td>颗粒物CADR</td><td>m<sup>3</sup>/h</td><t…

Gartner2014年魔力象限(商业智能和分析平台)

转载于:https://www.cnblogs.com/crsn/p/4271377.html

@SupperssWarnings注解

SupperssWarnings注解&#xff1a;压制、控制警告 SuppressWarnings(“rawtypes”) 是什么含义 SuppressWarnings压制警告&#xff0c;即去除警告 rawtypes是说传参时也要传递带泛型的参数 SuppressWarnings(“unchecked”) unchecked 执行了未检查的转换时的警告 SuppressWarn…

虚幻引擎C++编程游戏开发基础

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:23.8 GB |时长:44h 59m 学习C编程和游戏开发基础和虚幻引擎 你会学到什么 通过简单的例子和插…

Mybatis入门:3(动态sql)

动态sql语句 if标签 基本使用 一.在ProductDao接口中创建一个查询方法findByType import com.domain.Product;import java.util.List;public interface ProductDao {/*** 根据类型来查找* param product* return*/Product findByType(Product product); }二.在映射配置文件…

javaweb学习总结(二十三)——jsp自定义标签开发入门

一、自定义标签的作用 自定义标签主要用于移除Jsp页面中的java代码。 二、自定义标签开发和使用 2.1、自定义标签开发步骤 1、编写一个实现Tag接口的Java类(标签处理器类) 1 package me.gacl.web.tag;2 3 import java.io.IOException;4 5 import javax.servlet.http.HttpServle…

Java数组的三种声明方式

具体的细节大家可以不用先去了解,这涉及到很多知识,只要记住输出的时候,先导包,然后再利用Arrays.toString(arr)输出就行了。如:先定义好一个长度为4的新数组,此时数组为空,使用arr[ ]数组下标来进行逐个赋值。那我们定义好数组之后,就理所应当的对声明好的数组进行赋值。那么对于未涉及过编程的小伙伴,看到这可能会蒙了。原因就是我们sout(arr)时,输出的是这个数据的内存地址,而不是真实的数据。使用数组: 只需要一个变量,然后数组中存很多的数据, 其实可以把数组想成 一个容器。

Math: Math.atan() 与 Math.atan2() 计算两点间连线的夹角

Math.atan2()函数返回点(x,y)和原点(0,0)之间直线的倾斜角.那么如何计算任意两点间直线的倾斜角呢?只需要将两点x,y坐标分别相减得到一个新的点(x2-x1,y2-y1).然后利用他求出角度就可以了.使用下面的一个转换可以实现计算出两点间连线的夹角.然而,Math.atan()只能返回一个角度值,因此确定他的角度非常的复杂,而且,90度和270度的正切是无穷大,因为除数为零,我们也是比较难以处理的~!angel为一个角度的弧度值,slope为直线的斜率,是一个数字,这个数字可以是负的。

@RequiredArgsConstructor详解&@AllArgsConstructor和@RequiredArgsConstructor区别

RequiredArgsConstructor是Lombok的一个注解,简化了我们对@Autowired书写,我们在写Controller层或者Service层的时候,总是需要注入很多mapper接口或者service接口,如果每个接口都写上@Autowired,这样看起来就会很繁琐,@RequiredArgsConstructor注解可以代替@Autowired注解。

RDIFramework.NET ━ 9.8 用户权限管理 ━ Web部分

RDIFramework.NET ━ .NET快速信息化系统开发框架 9.8 用户权限管理 -Web部分 在实际应用中我们会发现&#xff0c;权限控制会经常变动&#xff0c;如&#xff1a;需要调整角色的分配&#xff0c;需要收回与授予某些角色、用户可访问的模块&#xff08;菜单&#xff09;与相应…

python并发

python并发 &#xff08;这部分还需要改&#xff0c;先将就着看&#xff09; Python 的 threading 模块引入了锁&#xff08;Lock&#xff09;。threading 模块提供了 Lock 和 RLock 两个类&#xff0c;它们都提供了如下两个方法来加锁和释放锁&#xff1a; acquire(blockingTr…

学会在Unity中创建一个Match-3益智游戏 Learn To Create a Match-3 Puzzle Game in Unity

MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; |时长:48场讲座(6h 38m) |大小解压后:2.8 GB 含课程文件 游戏开发变得容易了。使用Unity学习C#并创建自…

Mybatis入门:2(xml形式的增删改查)

xml形式的增删改查 这里感觉没啥好讲的&#xff0c;照着代码自己敲一遍、认真再看看应该都懂的。 Maven工程坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http:/…

NSDate见解

#import <Foundation/Foundation.h>int main(int argc, const char * argv[]) { // NSDate *date [NSDate date]; // // NSDateFormatter *formatter [[NSDateFormatter alloc] init];// yyyy 年// MM 月// dd 日// HH 24小时 hh 12小时// mm 分钟// ss 秒钟…

秒杀系统架构设计

秒杀活动的技术挑战 1. 对现有网站业务造成冲击 秒杀活动只是网站营销的一个附加活动&#xff0c;这个活动具有时间短&#xff0c;并发访问量大的特点&#xff0c;如果和网站原有应用部署在一起&#xff0c;必须会对现有业务造成冲击&#xff0c;稍有不慎可能导致整个网站瘫痪。…

SpringBoot 2.x 使用 JWT(JSON Web Token)

一、跨域认证遇到的问题 由于多终端的出现&#xff0c;很多的站点通过 web api restful 的形式对外提供服务&#xff0c;采用了前后端分离模式进行开发&#xff0c;因而在身份验证的方式上可能与传统的基于 cookie 的 Session Id 的做法有所不同&#xff0c;除了面临跨域提交 c…

在Unity中制作4种不同的游戏

流派:电子学习| MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;48.0 KHz 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09;|大小解压后:8.6 GB 含课程素材 |时长:15h 3m Unity 制作4款无代码手机游戏 Make 4 games in Unity with …

Spring学习笔记:1(初步认识概念)

Spring的三大主要特征 spring主要特征有三个&#xff1a;控制反转&#xff08;IOC&#xff09;&#xff0c;依赖注入&#xff08;DI&#xff09;和面向切面&#xff08;AOP&#xff09;。 IoC&#xff1a;Inverse of Control&#xff08;控制反转&#xff09; 1.对控制反转的…

shell example01

条件判断 if [[ -e ${1} ]]; thenecho "$(tput setaf 2) found ${1} $(tput sgr0)"cat ${1} elseecho "$(tput setaf 1) not found ${1} $(tput sgr0)"exit 1 fi//简化[[ -e ${1} && -e ${2} ]] && cat ${1} > ${2}//判断取反txt4.txti…

gradle教程 [原创](eclipse/ADT下 非插件 非Android Studio/AS)纯手打 第一篇:安装配置gradle...

一个bug 一个脚印的叫你们用gradle。 1介于网络上的很多资料都是老的 不适用与现在的新版本gradle 尤其是有些gradle方法改名了老的用不了 2介于网上都是粘贴复制并且零碎我很蛋疼啊&#xff0c;走了很多歪路才弄出来&#xff0c;所以我弄一个完全完整的版本 3我不但会写gradle…

java的static关键字

java的static关键字 静态变量和静态方法 static关键字最基本的用法是&#xff1a; 1、被static修饰的变量属于类变量&#xff0c;可以通过类名.变量名直接引用&#xff0c;而不需要new出一个类来 2、被static修饰的方法属于类方法&#xff0c;可以通过类名.方法名直接引用&…

Spring学习笔记:2(IOC装配Bean之xml方式)

xml配置方式装配Bean 本文借鉴于&#xff1a;https://www.cnblogs.com/qdhxhz/p/6511887.html Spring框架Bean实例化的方式提供了三种方式实例化Bean 构造方法实例化(默认无参数&#xff0c;用的最多)静态工厂实例化实例工厂实例化 代码如下&#xff1a; Bean1类(构造方法…

学习RPG Maker MZ开发创建并发布PC和移动端游戏

Complete RPG Maker MZ: Create and Publish for PC and Mobile 完整的RPG制造商MZ:为个人电脑和移动设备创建和发布 MP4 |视频:h264&#xff0c;1280720 |音频:AAC&#xff0c;44.1 KHz&#xff0c;2 Ch 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确…

CSS选择器总结

总结几种自己比较容易混淆的&#xff1a; 1. 后代选择器&#xff0c;写法是 E1 E2&#xff0c;如 ul li&#xff0c;选择的是所有后代&#xff0c;包括子后代、孙后代…; 2. 子选择器&#xff0c;写法 E1 > E2&#xff0c;只选择子后代&#xff0c;不包括孙后代元素&#xf…

OSChina 周六乱弹 —— 小明和网关超经典的故事~

2019独角兽企业重金招聘Python工程师标准>>> 周六&#xff0c;又到了瞎扯淡的时间了。周末&#xff0c;约会&#xff0c;男男女女&#xff0c;还有那啥那啥&#xff0c;你们懂得&#xff5e; 男人和女人明显不同&#xff0c;这样才导致了异性相吸吗&#xff1f; 1. …

概念艺术绘画学习教程 Schoolism – Foolproof Concept Painting with Airi Pan

Schoolism——万无一失的概念绘画潘 大小解压后&#xff1a;3.19G 含课程素材文件 1920X1080 .mp4 语言&#xff1a;英语中英文字幕&#xff08;根据原英文字幕机译更准确&#xff09; 信息: 万无一失的概念绘画潘 本课程由概念设计师兼插画师潘开发&#xff0c;与大家分享她…