[Asp.net 5] DependencyInjection项目代码分析4-微软的实现(5)(IEnumerable<>补充)
2015-06-07 18:36
811 查看
Asp.net 5的依赖注入注入系列可以参考链接: [Asp.net 5] DependencyInjection项目代码分析-目录
我们在之前讲微软的实现时,对于OpenIEnumerableService与ClosedIEnumerableService抛下没讲,现在我们就将该部分补充完整。
我们回忆ServiceProvider类的构造函数(对外部使用的)中,注册了IEnumerable<>、new OpenIEnumerableService(_table)的关系。
ClosedIEnumerableService
[之前我们介绍ServiceEntry时,明确指出是链表结构,而不是单独存放一个值;其应用在这进行了淋漓尽致的表现]
我们在之前讲微软的实现时,对于OpenIEnumerableService与ClosedIEnumerableService抛下没讲,现在我们就将该部分补充完整。
我们回忆ServiceProvider类的构造函数(对外部使用的)中,注册了IEnumerable<>、new OpenIEnumerableService(_table)的关系。
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时,明确指出是链表结构,而不是单独存放一个值;其应用在这进行了淋漓尽致的表现]
相关文章推荐
- ASP.NET MVC3 利用滚动条加载数据
- IoC容器Autofac(4) - Autofact + Asp.net MVC + EF Code First(附源码)
- ASP.NET:在一般处理程序中通过 Session 保存验证码却无法显示图片?
- Win8操作系统下IIS如何配置asp.net的运行环境
- ASP.NET检测到不安全 Request.Form 值解决方案汇总
- ValidationSugar表单验证框架-支持ASP.NET MVC ASP.NET WebFroM
- asp.net开发微信公众平台之验证消息的真实性
- asp.net开发微信公众平台之获取用户消息并处理
- ASP.NET完整打包卸载更新攻略(By Installshield 2010)
- ASP.NET中CKEditor与CKFinder的配置使用
- asp(Parameters) 参数化实现方法
- ASP.NET中集成百度编辑器UEditor
- asp.net实现文件无刷新上传方法汇总
- ASP.Net刷新页面后自动滚动到原来位置方法汇总
- Asp.net 2.0 无刷新图片上传 显示缩略图 具体实现
- ASP.NET方面的一些经典文章收集
- ASP.Net刷新页面后自动滚动到原来位置方法汇总
- asp.net实现文件无刷新上传方法汇总
- ASP.NET中集成百度编辑器UEditor
- ASP.NET中CKEditor与CKFinder的配置使用