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