兰州网站开发价格,那个视频网站可以做桌面背景,网络建设与管理专业好就业吗,中国进出口贸易官网前面我们讲到 IOptions 和 IOptionsSnapshot#xff0c;他们两个最大的区别便是前者注册的是单例模式#xff0c;后者注册的是 Scope 模式。而 IOptionsMonitor 则要求配置源必须是可监听的#xff0c;用来实现 Options 实例的自动更新#xff0c;并对外提供了 OnChage 事件…前面我们讲到 IOptions 和 IOptionsSnapshot他们两个最大的区别便是前者注册的是单例模式后者注册的是 Scope 模式。而 IOptionsMonitor 则要求配置源必须是可监听的用来实现 Options 实例的自动更新并对外提供了 OnChage 事件给我们更多的控制权。
IOptionsMonitor
public interface IOptionsMonitorout TOptions
{TOptions CurrentValue { get; } TOptions Get(string name); IDisposable OnChange(ActionTOptions listener);
}
IOptionsMonitor 与 IOptionsSnapshot 类似都提供了根据指定名称获取 Options 的功能并多了一个 OnChange 方法。而它的默认实现者是 OptionsMonitor。
public static IServiceCollection AddOptions(this IServiceCollection services){...services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptions), typeof(OptionsManager)));services.TryAdd(ServiceDescriptor.Scoped(typeof(IOptionsSnapshot), typeof(OptionsManager)));services.TryAdd(ServiceDescriptor.Singleton(typeof(IOptionsMonitor), typeof(OptionsMonitor)));...
}
OptionsMonitor
public class OptionsMonitorTOptions : IOptionsMonitorTOptions where TOptions : class, new()
{ private readonly IOptionsMonitorCacheTOptions _cache; private readonly IOptionsFactoryTOptions _factory; private readonly IEnumerableIOptionsChangeTokenSourceTOptions _sources; internal event ActionTOptions _onChange; public OptionsMonitor(IOptionsFactoryTOptions factory, IEnumerableIOptionsChangeTokenSourceTOptions sources, IOptionsMonitorCacheTOptions cache) {_factory factory;_sources sources;_cache cache; foreach (var source in _sources){ChangeToken.OnChange(() source.GetChangeToken(),() InvokeChanged());}} public TOptions CurrentValue { get Get(Options.DefaultName); } public virtual TOptions Get(string name) _cache.GetOrAdd(name, () _factory.Create(name)); private void InvokeChanged() {...} public IDisposable OnChange(ActionTOptions listener) {...}
}
首先看构造函数中的三个参数其中 IOptionsFactory 和 IOptionsMonitorCache 在上一章已讲过而第二个 IOptionsChangeTokenSource 则是用来实现对配置源的监听
public interface IOptionsChangeTokenSourceout TOptions
{ IChangeToken GetChangeToken(); string Name { get; }
}
通过 GetChangeToken 获取 ChangeToken , 从而注册其 InvokeChanged 方法
private void InvokeChanged(){ _cache.TryRemove(Options.DefaultName); var options CurrentValue; if (_onChange ! null){_onChange.Invoke(options);}
}
首先移除 Options 缓存再通过 IOptionsFactory 重新创建 Options然后调用 _onChange 事件。
而 OnChange 方法则用来注册 _onChange 事件
public IDisposable OnChange(ActionTOptions listener){ var disposable new ChangeTrackerDisposable(this, listener);_onChange disposable.OnChange; return disposable;
}
这里又使用了一个 OptionsMonitore 的包装类用来实现事件的注销
internal class ChangeTrackerDisposable : IDisposable{ private readonly ActionTOptions _listener; private readonly OptionsMonitorTOptions _monitor; public ChangeTrackerDisposable(OptionsMonitorTOptions monitor, ActionTOptions listener) {_listener listener;_monitor monitor;} public void OnChange(TOptions options) _listener.Invoke(options); public void Dispose() _monitor._onChange - OnChange;
}
再去看一下 IConfigurationChangeTokenSource 的实现
ConfigurationChangeTokenSource
IConfigurationChangeTokenSource 的默认实现类便是 ConfigurationChangeTokenSource :
public static IServiceCollection ConfigureTOptions(this IServiceCollection services, string name, IConfiguration config) where TOptions : class{...services.AddSingletonIOptionsChangeTokenSourceTOptions(new ConfigurationChangeTokenSourceTOptions(name, config));...
}
ConfigurationChangeTokenSource 构造函数要求传入 IConfiguration其而 ChangeToken 的获取便是通过 IConfiguration 来得到的
public interface IConfiguration{... IChangeToken GetReloadToken();...
}public class ConfigurationChangeTokenSourceTOptions : IOptionsChangeTokenSourceTOptions
{ private IConfiguration _config; public ConfigurationChangeTokenSource(IConfiguration config) : this(Options.DefaultName, config) { } public ConfigurationChangeTokenSource(string name, IConfiguration config) { if (config null){ throw new ArgumentNullException(nameof(config));}_config config;} public string Name { get; } public IChangeToken GetChangeToken() { return _config.GetReloadToken();}
}
因此要想使用 IOptionsMonitor必须要使用 IConfiguration 进行注册才可以当然你也可以实现自己的 ChangeToken。
总结
本章介绍了 IOptionsMonitor 的实现通过 IConfiguration 所提供的 ChangeToken 来注册监听事件对其 CurrentValue 进行更新。到此ASP.NET Core 中的 Options 源码也就分析完了其本身比较简单并没有太多东西。更具体的可以去 Github 上看完整的源码而 .NET Core 才刚刚发布了 Preview2 版本随时可能会有大的变化而我也会保持更新通过观察每次的变化也能学到更多的编程思想也是一件很快乐的事。
相关文章
ASP.NET Core 源码学习之 Options[1]:ConfigureASP.NET Core 源码学习之 Options[2]:IOptionsASP.NET Core 源码学习之 Options[3]:IOptionsSnapshotASP.NET Core MVC 源码学习详解 Action 的匹配asp.net core源码飘香从Hosting开始asp.net core源码飘香Configuration组件asp.net core源码飘香Options组件asp.net core源码飘香Logging组件
原文地址http://www.cnblogs.com/RainingNight/p/strongly-typed-options-ioptions-monitor-in-asp-net-core.html .NET社区新闻深度好文微信中搜索dotNET跨平台或扫描二维码关注