加入收藏 | 设为首页 | 会员中心 | 我要投稿 河北网 (https://www.hebeiwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程 > 正文

详解ASP.NET Core3.0 配置的Options模式

发布时间:2020-08-22 05:34:22 所属栏目:编程 来源:网络整理
导读:这篇文章首要先容了详解ASP.NET Core3.0 设置的Options模式,文中通过示例代码先容的很是具体,对各人的进修可能事变具有必然的参考进修代价,必要的伴侣们下面

首要看它的TOptions Create(string name)要领。这里会遍历它的_setups荟萃,这个荟萃范例为IEnumerable<IConfigureOptions<TOptions>>,在讲Options模式的依靠注入的时辰已经知道,每一个Configure、ConfigureAll现实上就是向依靠注入容器中注册了一个IConfigureOptions<TOptions>,只是名称也许差异。而PostConfigure和PostConfigureAll要领注册的是IPostConfigureOptions<TOptions>范例,对应的就是_postConfigures荟萃。

起首会遍历_setups荟萃,挪用IConfigureOptions<TOptions>的Configure要领,这个要领的首要代码就是:

if (Name == null || name == Name) { Action?.Invoke(options); }

假如Name值为null,即对应的是ConfigureAll要领,则执行该Action。可能Name值和必要读取的值沟通,则执行该Action。

_setups荟萃遍历之后,同样的机制遍历_postConfigures荟萃。这就是上一节关于Configure、ConfigureAll、PostConfigure和PostConfigureAll的执行次序的验证。

最终返回对应的实例并写入缓存。这就是IOptions和IOptionsSnapshot两种模式的处理赏罚机制,接下来看一下IOptionsMonitor模式,它对应的实现是OptionsMonitor。代码如下:

public class OptionsMonitor<TOptions> : IOptionsMonitor<TOptions> where TOptions : class, new() { private readonly IOptionsMonitorCache<TOptions> _cache; private readonly IOptionsFactory<TOptions> _factory; private readonly IEnumerable<IOptionsChangeTokenSource<TOptions>> _sources; internal event Action<TOptions, string> _onChange; public OptionsMonitor(IOptionsFactory<TOptions> factory, IEnumerable<IOptionsChangeTokenSource<TOptions>> sources, IOptionsMonitorCache<TOptions> cache) { _factory = factory; _sources = sources; _cache = cache; foreach (var source in _sources) { var registration = ChangeToken.OnChange( () => source.GetChangeToken(), (name) => InvokeChanged(name), source.Name); _registrations.Add(registration); } } private void InvokeChanged(string name) { name = name ?? Options.DefaultName; _cache.TryRemove(name); var options = Get(name); if (_onChange != null) { _onChange.Invoke(options, name); } } public TOptions CurrentValue { get => Get(Options.DefaultName); } public virtual TOptions Get(string name) { name = name ?? Options.DefaultName; return _cache.GetOrAdd(name, () => _factory.Create(name)); } public IDisposable OnChange(Action<TOptions, string> listener) { var disposable = new ChangeTrackerDisposable(this, listener); _onChange += disposable.OnChange; return disposable; } internal class ChangeTrackerDisposable : IDisposable { private readonly Action<TOptions, string> _listener; private readonly OptionsMonitor<TOptions> _monitor; public ChangeTrackerDisposable(OptionsMonitor<TOptions> monitor, Action<TOptions, string> listener) { _listener = listener; _monitor = monitor; } public void OnChange(TOptions options, string name) => _listener.Invoke(options, name); public void Dispose() => _monitor._onChange -= OnChange; } }

大部门成果和OptionsManager相同,只是因为它是回收了Singleton模式,以是它是回收监听数据源改变并更新的模式。当通过Configuration作为数据源注册Option的时辰,多了一条IOptionsChangeTokenSource的依靠注入。当数据源产生改变的时辰更新数据并触发OnChange(Action<TOptions, string> listener),在第一节的数据更新提示中有相干的例子。

到此这篇关于详解ASP.NET Core3.0 设置的Options模式的文章就先容到这了,更多相干ASP.NET Core3.0 设置Options模式内容请搜刮剧本之家早年的文章或继承赏识下面的相干文章但愿各人往后多多支持剧本之家!

(编辑:河北网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读