您的位置:首页 > 编程语言 > ASP

[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)的关系。

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时,明确指出是链表结构,而不是单独存放一个值;其应用在这进行了淋漓尽致的表现]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: