麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁(yè) > 學(xué)院 > 開發(fā)設(shè)計(jì) > 正文

[Asp.net 5] DependencyInjection項(xiàng)目代碼分析4-微軟的實(shí)現(xiàn)(5)(IEnumerable<>補(bǔ)充)

2019-11-17 02:09:09
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

[asp.net 5] DependencyInjection項(xiàng)目代碼分析4-微軟的實(shí)現(xiàn)(5)(IEnumerable<>補(bǔ)充)

Asp.net 5的依賴注入注入系列可以參考鏈接: [Asp.net 5] DependencyInjection項(xiàng)目代碼分析-目錄

我們?cè)谥爸v微軟的實(shí)現(xiàn)時(shí),對(duì)于OpenIEnumerableService與ClosedIEnumerableService拋下沒(méi)講,現(xiàn)在我們就將該部分補(bǔ)充完整。

我們回憶ServicePRovider類的構(gòu)造函數(shù)(對(duì)外部使用的)中,注冊(cè)了IEnumerable<>、new OpenIEnumerableService(_table)的關(guān)系。

        public ServiceProvider(IEnumerable<ServiceDescriptor> serviceDescriptors)        {            _root = this;            _table = new ServiceTable(serviceDescriptors);            _table.Add(typeof(IServiceProvider), new ServiceProviderService());            _table.Add(typeof(IServiceScopeFactory), new ServiceScopeService());            _table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table));        }
ServiceProvider構(gòu)造函數(shù)

因?yàn)镮Enumerable是泛型,所以我們可以推斷OpenIEnumerableService類應(yīng)該實(shí)現(xiàn)IGenericService接口。那么如果我們想查找IEnumerable<T>的實(shí)現(xiàn)類中間會(huì)有怎樣的過(guò)程呢?

  • [步驟1]首先系統(tǒng)會(huì)查找在ServiceTable內(nèi)部_services(Dictionary<Type, ServiceEntry>類型)是否有注冊(cè)過(guò)IEnumerable<T>類型,如果有注冊(cè)直接返回實(shí)現(xiàn)類中最后一個(gè)。下面是直接包含IEnumerable<T>的原因
    • 系統(tǒng)可以顯示的注冊(cè)IEnumerable<T>,比如services.AddTransient<IEnumerable<T>, List<T>>();
    • 系統(tǒng)也可能之前獲取過(guò)IEnumerable<T>,所以_services中有上次結(jié)果的緩存。
  • [步驟2]如果沒(méi)有找到相應(yīng)的IEnumerable<T>,系統(tǒng)會(huì)繼續(xù)通過(guò)_genericServices(Dictionary<Type, List<IGenericService>>類型)查找IEnumerable<>,與通過(guò)_services方式獲取不同,通過(guò)_genericServices會(huì)獲取到的是所有注冊(cè)過(guò)IEnumerable<>類型對(duì)應(yīng)的IGenericService列表(List類型,包含順序)并不是單一一個(gè)IGenericService;之后順序遍歷IGenericService列表,將IEnumerable<T>/IGenericService.GetService()的對(duì)應(yīng)關(guān)系添加到services中,重復(fù)[步驟1]的操作獲取。
    • 如果系統(tǒng)沒(méi)額外注冊(cè)IEnumerable<>類型,那么_genericServices的列表中只能獲取唯一的注冊(cè)項(xiàng)OpenIEnumerableService,那么相應(yīng)的操作則在OpenIEnumerableService中進(jìn)行。
    • 如果系統(tǒng)額外注冊(cè)IEnumerable<>類型(假設(shè)為GenericService1),那么在注冊(cè)列表中GenericService1一定排在OpenIEnumerableService之后。所以當(dāng)獲取IEnumerable<T>時(shí),OpenIEnumerableService.GetService()與GenericService1.GetService()返回值一定都會(huì)添加到_services中,但是GenericService1.GetService()一定在后面,所以IEnumerable<T>的實(shí)現(xiàn)類一定是GenericService1.GetService().CreateCallSite().Invoke()的值;換句話說(shuō)GenericService1會(huì)將OpenIEnumerableService覆蓋掉。
    • 由于注冊(cè)IEnumerable<>會(huì)覆蓋掉OpenIEnumerableService,所以原則上不允許注冊(cè)IEnumerable<>類型

OpenIEnumerableService與ClosedIEnumerableService

由于OpenIEnumerableService實(shí)現(xiàn)IGenericService接口,所以會(huì)返回IService類型的對(duì)象,該對(duì)象是ClosedIEnumerableService類型。ClosedIEnumerableService類型內(nèi)部實(shí)際上返回的是ServiceTable中_services所有T的注冊(cè)項(xiàng),之后以IEnumerable<T>類型返回。

    internal class OpenIEnumerableService : IGenericService    {        private readonly ServiceTable _table;        public OpenIEnumerableService(ServiceTable table)        {            _table = table;        }        public ServiceLifetime Lifetime        {            get { return ServiceLifetime.Transient; }        }        public IService GetService(Type closedServiceType)        {            var itemType = closedServiceType.GetTypeInfo().GenericTypeArguments[0];            ServiceEntry entry;            return _table.TryGetEntry(itemType, out entry) ?                new ClosedIEnumerableService(itemType, entry) :                null;        }    }
OpenIEnumerableService
    internal class ClosedIEnumerableService : IService    {        private readonly Type _itemType;        private readonly ServiceEntry _serviceEntry;        public ClosedIEnumerableService(Type itemType, ServiceEntry entry)        {            _itemType = itemType;            _serviceEntry = entry;        }        public IService Next { get; set; }        public ServiceLifetime Lifetime        {            get { return ServiceLifetime.Transient; }        }        public IServiceCallSite CreateCallSite(ServiceProvider provider, ISet<Type> callSiteChain)        {            var list = new List<IServiceCallSite>();            for (var service = _serviceEntry.First; service != null; service = service.Next)            {                list.Add(provider.GetResolveCallSite(service, callSiteChain));            }            return new CallSite(_itemType, list.ToArray());        }        private class CallSite : IServiceCallSite        {            private readonly Type _itemType;            private readonly IServiceCallSite[] _serviceCallSites;            public CallSite(Type itemType, IServiceCallSite[] serviceCallSites)            {                _itemType = itemType;                _serviceCallSites = serviceCallSites;            }            public object Invoke(ServiceProvider provider)            {                var array = Array.CreateInstance(_itemType, _serviceCallSites.Length);                for (var index = 0; index != _serviceCallSites.Length; ++index)                {                    array.SetValue(_serviceCallSites[index].Invoke(provider), index);                }                return array;            }            public Expression Build(Expression provider)            {                return Expression.NewArrayInit(                    _itemType,                    _serviceCallSites.Select(callSite =>                        Expression.Convert(                            callSite.Build(provider),                            _itemType)));            }        }    }
ClosedIEnumerableService

[之前我們介紹ServiceEntry時(shí),明確指出是鏈表結(jié)構(gòu),而不是單獨(dú)存放一個(gè)值;其應(yīng)用在這進(jìn)行了淋漓盡致的表現(xiàn)]


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 久久精品站 | 日本成人一二三区 | 成片免费观看大全 | 久色亚洲| 性生活视频网站 | 国产91久久久久久 | 亚洲成人在线视频网站 | av色哟哟 | 黄色试看视频 | 午夜视频观看 | 欧美亚洲一区二区三区四区 | 黄色特级视频 | 亚洲一区二区三区视频免费 | 精品久久久久久久久久久久久久 | 国内精品视频饥渴少妇在线播放 | 国产成人精品无人区一区 | 日本大片在线播放 | 国产精品一区二区三区在线 | 国产又粗又爽又深的免费视频 | 色婷婷久久久 | 免费观看黄色一级视频 | 91情侣偷在线精品国产 | 久久久99精品视频 | 黄色网址免费进入 | 中文区中文字幕免费看 | 成人综合一区二区 | 欧美三级日本三级少妇99 | 精品成人免费一区二区在线播放 | 国产精品国产三级国产在线观看 | 国内久久久久 | 日韩黄色av网站 | 欧美精品激情在线 | 99亚洲伊人久久精品影院红桃 | 亚洲精品欧美在线 | 女人叉开腿让男人桶 | 成人在线精品视频 | 欧美xxxx精品另类 | 在线观看视频毛片 | 国产精品999在线 | 久久精品爱 | 精品中文字幕在线观看 |