TOptions options) = _cache.TryAdd(name
标签:
六、IOptionsMonitorCache<TOptions>IOptionsFactory<TOptions>解决了Options的创建与初始化问题,但由于它自身是无状态的,所以Options模型对Options东西实施缓存可以获得更好的性能。Options模型中针对Options东西的缓存由IOptionsMonitorCache<TOptions>东西来完成,如下所示的代码片段是该接口的界说。
public interface IOptionsMonitorCache<TOptions> where TOptions : class { TOptions GetOrAdd(string name, Func<TOptions> createOptions); bool TryAdd(string name, TOptions options); bool TryRemove(string name); void Clear(); }
由于Options模型总是按照名称来供给对应的Options东西,所以IOptionsMonitorCache<TOptions>东西也按照名称来缓存Options东西。如上面的代码片段所示,IOptionsMonitorCache<TOptions>接口供给了4个要领,分袂实现针对Options缓存的获取、添加、移除和清理。IOptionsMonitorCache<TOptions>接口的默认实现是前面提到的OptionsCache<TOptions>类型,OptionsManager东西会将其作为自身的“私有”缓存。实此刻OptionsCache<TOptions>类型中针对Options东西的缓存逻辑其实很简单:它仅仅使用一个ConcurrentDictionary<string, Lazy<TOptions>>东西作为缓存Options的容器而已。如下所示的代码片段根基上浮现了OptionsCache<TOptions>类型的实现逻辑。
public class OptionsCache<TOptions> : IOptionsMonitorCache<TOptions> where TOptions : class { private readonly ConcurrentDictionary<string, Lazy<TOptions>> _cache = new ConcurrentDictionary<string, Lazy<TOptions>>(StringComparer.Ordinal); public void Clear() => _cache.Clear(); public virtual TOptions GetOrAdd(string name, Func<TOptions> createOptions) => _cache.GetOrAdd(name, new Lazy<TOptions>(createOptions)).Value; public virtual bool TryAdd(string name, TOptions options) => _cache.TryAdd(name, new Lazy<TOptions>(() => options)); public virtual bool TryRemove(string name) => _cache.TryRemove(name, out var ignored); }
七、IOptionsMonitor<TOptions>Options模型之所以将暗示缓存的接口定名为IOptionsMonitorCache<TOptions>,是因为缓存最初是为IOptionsMonitor<TOptions>东西处事的,该东西旨在实现针对承载Options东西的原始数据源的监控,并在检测到数据更新后及时替换缓存的Options东西。
public interface IOptionsMonitor<out TOptions> { TOptions CurrentValue { get; } TOptions Get(string name); IDisposable OnChange(Action<TOptions, string> listener); }
除了直接挪用界说在IOptionsMonitor<TOptions>接口中的OnChange要领注册应用新Options东西的回调,还可以挪用如下这个同名的扩展要领。通过OnChange要领注册的回调是一个类型为Action<TOptions>的委托东西,由于缺少输出参数来区分Options的名称,所以注册的回调适用于所有的Options东西。值得一提的是,这两个OnChange要领的返回类型为IDisposable,实际上代表了针对回调的注册,我们可以挪用返回东西的Dispose要领解除注册。
public static class OptionsMonitorExtensions { public static IDisposable OnChange<TOptions>( this IOptionsMonitor<TOptions> monitor, Action<TOptions> listener) => monitor.OnChange((o, _) => listener(o)); }
.NET Core应用在进行数据变革监控时总是使用一个IChangeToken东西来发送通知,用于监控Options数据变革的IOptionsMonitor<TOptions>东西自然也不例外。IOptionsMonitor<TOptions>东西在检测到数据变革后用于对外发送通知的IChangeToken东西是由一个IOptionsChangeTokenSource<TOptions>东西完成的。IOptionsChangeTokenSource<TOptions>接口的Name属性暗示Options的名称,,而前面所说的IChangeToken东西由其GetChangeToken要领来供给。
public interface IOptionsChangeTokenSource<out TOptions> { string Name { get; } IChangeToken GetChangeToken(); }
Options模型界说了如下这个OptionsMonitor<TOptions>类型作为对IOptionsMonitor<TOptions>接口的默认实现。当挪用结构函数创建一个OptionsMonitor<TOptions>东西时需要供给一个用来创建和初始化Options东西的IOptionsFactory<TOptions>东西,一个用来对供给的Options东西实施缓存的IOptionsMonitorCache<TOptions>东西,以及一组用来检测配置选项数据变革并对外发送通知的IOptionsChangeTokenSource<TOptions>东西。
温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/web/31610.html