亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 開發設計 > 正文

[Asp.net5]Options-配置文件(2)

2019-11-14 14:31:01
字體:
來源:轉載
供稿:網友

很久之前寫過一篇介紹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 fired                    var 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),如此而已。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产日韩精品视频| 欧洲中文字幕国产精品| 久久91精品国产91久久久| 国产精品久久久av久久久| 久久精品国产99国产精品澳门| 亚洲国产精品国自产拍av秋霞| 91精品国产自产在线观看永久| 日韩精品在线免费播放| 国产欧美精品一区二区| 狠狠色狠色综合曰曰| 亚洲欧美色婷婷| 亚洲色图国产精品| 欧美电影电视剧在线观看| 国产精品久久久久久久久久东京| 九色精品免费永久在线| 国产午夜精品全部视频播放| 日产精品久久久一区二区福利| 亚洲free性xxxx护士hd| 国产精品99久久久久久久久久久久| 亚洲国产高清高潮精品美女| 国产精品久久久精品| 精品少妇v888av| 欧美午夜精品久久久久久久| 日本一区二区三区在线播放| 亚洲www在线观看| 成人午夜在线观看| 色哟哟网站入口亚洲精品| 日韩中文有码在线视频| 亚洲成年网站在线观看| 欧美激情乱人伦| 亚洲第一免费播放区| 国产精品永久免费视频| 亚洲乱亚洲乱妇无码| 国产小视频国产精品| 日本免费久久高清视频| 一区二区三区无码高清视频| 久久91亚洲精品中文字幕| 麻豆一区二区在线观看| 91在线观看免费高清| 日韩精品视频中文在线观看| 亚洲另类激情图| 成人网在线观看| 欧美国产极速在线| 国产欧美在线播放| 日韩最新av在线| 国产精品吊钟奶在线| 中文字幕日韩专区| 欧美孕妇毛茸茸xxxx| 亚洲全黄一级网站| 日韩av在线网址| 欧美电影免费在线观看| 91精品视频播放| 久久91精品国产91久久久| 成人激情视频小说免费下载| 日韩视频免费大全中文字幕| 日韩高清人体午夜| 久久久久亚洲精品国产| 日韩高清av一区二区三区| 日韩国产在线播放| 在线观看国产精品淫| 国产精品久久婷婷六月丁香| 亚洲精品99久久久久| 日韩电影中文字幕在线观看| 成人国产在线激情| 亚洲一级一级97网| 国产精品入口夜色视频大尺度| 欧美日本在线视频中文字字幕| 91系列在线观看| 欧美成人在线免费视频| 26uuu亚洲伊人春色| 欧美高清在线观看| 久久久久久久一区二区三区| 久久久久久亚洲| 亚洲欧洲在线观看| 久久久精品亚洲| 亚洲va欧美va国产综合剧情| 日本高清不卡的在线| 日韩av在线播放资源| 国产精品视频中文字幕91| 久久久在线视频| 成人久久久久爱| www.日韩不卡电影av| 中文字幕日韩欧美在线视频| 久久免费视频在线| 亚洲天堂男人的天堂| 亚洲午夜女主播在线直播| 中文字幕久久精品| 亚洲天堂第二页| 久久精品99国产精品酒店日本| 91九色视频导航| 日韩免费在线看| 2023亚洲男人天堂| 成人有码在线播放| 久久免费视频这里只有精品| 欧美丝袜第一区| 成人久久精品视频| 亚洲春色另类小说| 欧美激情一二三| 国产精品扒开腿做爽爽爽的视频| 欧美精品在线免费观看| 欧美精品www| 97在线看免费观看视频在线观看| 日本高清+成人网在线观看| 欧美极品少妇xxxxⅹ免费视频| 中文字幕欧美国内| 欧美一区二区大胆人体摄影专业网站| 欧美国产日韩一区| 色与欲影视天天看综合网| 成人黄色在线免费| 国产免费亚洲高清| 97国产精品视频人人做人人爱| 亚洲小视频在线观看| 日韩欧美国产网站| 成人a免费视频| 538国产精品一区二区在线| 青青在线视频一区二区三区| www.亚洲免费视频| 亚洲a成v人在线观看| 久久久久久亚洲精品中文字幕| 亚洲电影第1页| 欧美另类暴力丝袜| 亚洲精品动漫久久久久| 精品久久久久久中文字幕一区奶水| 欧美精品18videosex性欧美| 国产精品27p| 国产精品视频999| 一夜七次郎国产精品亚洲| 日韩精品中文字幕在线观看| 高清在线视频日韩欧美| 91影视免费在线观看| 久久精品99久久香蕉国产色戒| 91九色蝌蚪国产| 国产精品美腿一区在线看| 久久99久国产精品黄毛片入口| 欧美尺度大的性做爰视频| 日韩久久午夜影院| 成人黄色免费在线观看| 一色桃子一区二区| 欧美高清视频一区二区| 91大神在线播放精品| 亚洲精品中文字幕女同| 九九热最新视频//这里只有精品| 国产美女久久精品| 久久精品国产综合| 亚洲欧美日韩国产成人| 亚洲最大av在线| 亚洲国内精品在线| 亚洲iv一区二区三区| 日韩精品欧美国产精品忘忧草| yw.139尤物在线精品视频| 国产精品欧美日韩一区二区| 免费不卡欧美自拍视频| 亚洲精品综合久久中文字幕| 欧美最猛黑人xxxx黑人猛叫黄| 亚洲社区在线观看| 国产精品h在线观看| 精品女厕一区二区三区| 国外视频精品毛片| 国产精品永久免费观看| 日韩在线观看视频免费| 国产97人人超碰caoprom| 日本精品一区二区三区在线播放视频| 欧美电影免费观看高清完整| 亚洲午夜未满十八勿入免费观看全集|