很久之前写过一篇介绍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

[Asp.net 5] Options-配置文件(2)相关推荐

  1. ASP.NET中的配置文件

    ASP.NET中的配置文件 原创 2014年10月13日 08:15:27 1199 在机房收费系统的时候曾经应用过配置文件,当时也就那么一用对配置文件了解的不是很透彻,下面就来总结一下有关配置文件的 ...

  2. ASP.NET2.0中配置文件的加密与解密

    首先添加引用: using System.Web.Configuration; 加密操作如下: private void ProtectSection(string sectionName, stri ...

  3. asp.net网站的配置文件

    一个网站可以没有配置文件也可以有多个,配置文件的名称必须是web.config,一个目录只能有一个配置文件.         网站配置文件之间是继承关系.         锁定配置文件的某些项,不允许 ...

  4. RoadFlow ASP.NET Core工作流配置文件说明

    工作流配置文件及说明如下: { "Logging": { "LogLevel": { "Default": "Warning&qu ...

  5. Asp.Net Core 第05局:读取配置

    前言 本文介绍Asp.Net Core 读取配置文件. 环境 1.Visual Studio 2017 2.Asp.Net Core 2.2 开局 前期准备 1.添加app.json文件并在里面添加内 ...

  6. 认识ASP.NET 5项目结构和项目文件xproj

    ASP.NET 5 在项目结构上做了很大的改变,我们以前熟悉的目录结构与项目文件内容都不太一样了,本篇文章带大家了解 ASP.NET 5 到底跟以前有哪些不一样的地方. 我们先用 Visual Stu ...

  7. ASP.NET AJAX环境的简单构建(ZT)

    1 概述 Microsoft ASP.NET AJAX 是 Microsoft 公司对 Ajax 技术的完美封装.它能使你已快速的创建包含丰富用户体验的用户界面的 Web 页面,提供加入了跨浏览器的 ...

  8. Web.config配置文件详解(新手必看)

    Web.config配置文件详解(新手必看) 花了点时间整理了一下ASP.NET Web.config配置文件的基本使用方法.很适合新手参看,由于Web.config在使用很灵活,可以自定义一些节点. ...

  9. IIS与ASP.NET对请求的处理

    IIS接收请求到进入CLR 当用户向服务器发送的请求时,以驱动形式运行的HTTP.SYS接收到该请求,将其分发给W3SVC:IIS6中,W3SVC会去解析出UR,并根据从Metabase获取的URL与 ...

  10. 项目实践精解:ASP.NET应用开发

    前 言 作者从事软件设计开发工作十多年,最近才萌发了写书的想法.因为作者希望推广一种最有效的学习捷径,这就是Project-Driven Training,也就是用项目实践来带动理论学习的方法.基于此 ...

最新文章

  1. 使用SqlBulkCopy进行数据大批量的迁移
  2. [hdu6434]Problem I. Count
  3. JavaScript 中一句话的思索:this是函数在执行时所处的作用域
  4. GDT(全局描述符表)和LDT(局部描述符表)
  5. 云拨测助力节卡机器人 全面优化海外网站性能
  6. Cortex-M3-指针和野指针
  7. 一次“内存泄露”引发的血案
  8. Java 32 进制_32位数字的十六进制表示
  9. Vue组件相关的知识
  10. pom文件报错_FastDFS实战总结,分布式文件存储,高并发高可用,看这篇就够了...
  11. GD32MCU硬件I2C学习(一)
  12. 【信号处理】音频信号处理平台含Matlab源码
  13. unity3D的FingerGestures插件详细说明
  14. 元气森林们迈入新消费后时代
  15. Windows 10 uefi引导模式 GPT+UEFI Ghost系统备份还原步骤
  16. 从FutureTask内部类WaitNode深入浅出分析FutureTask实现原理
  17. 深度神经网络和循环神经网络,深层循环神经网络
  18. 2021-06-22第十章主讲
  19. BearSkill之UIView挖空处理
  20. java.sql.SQLNonTransientConnectionException: Public Key Retrieval is not allowed

热门文章

  1. Alibaba Cloud Linux 2.1903 LTS 64位服务器yum源下载404,Alibaba Cloud Linux 2实例中使用docker-ce、epel等YUM源安装软件失败
  2. do还是doing imagine加to_中学必背英语短语集合:54个doing动名词的固定搭配
  3. etcd 笔记(06)— Client 结构定义、客户端(初始化、KV存储Get、Put、事务 Txn、压缩 Compact、Watch、Lease
  4. 2022-2028年中国氟硅橡胶产业发展动态及投资前景分析报告
  5. Go 学习笔记(58)— Go 第三方库之 etcd/clientv3(连接客户端、PUT、GET、Lease、Op、Txn、Watch 基础概念说明)
  6. Docker 入门系列(3)- Docker 容器(创建、启动、终止、进入、删除、导入、导出容器、容器和镜像转化)
  7. C++核心编程(三)
  8. Win10家庭版如何启用本地组策略
  9. TVM,Relay,Pass
  10. 在NVIDIA A100 GPU上利用硬件JPEG解码器和NVIDIA nvJPEG库