06-004 DependencyInjection 之 IServiceCallSite(2)
Posted on 2015-03-25 12:35 DotNet1010 阅读(100) 评论(0) 收藏 举报接着看一下 ServicePrivider 中的四个实现了IServiceCallSite的类:
private class EmptyIEnumerableCallSite : IServiceCallSite{}
private class TransientCallSite : IServiceCallSite{}
private class ScopedCallSite : IServiceCallSite{}
private class SingletonCallSite : ScopedCallSite{}
EmptyIEnumerableCallSite 代码如下:
private class EmptyIEnumerableCallSite : IServiceCallSite
{
private readonly object _serviceInstance;
private readonly Type _serviceType;
public EmptyIEnumerableCallSite(Type serviceType, object serviceInstance)
{
_serviceType = serviceType;
_serviceInstance = serviceInstance; // _serviceInstance 是空数组
}
public object Invoke(ServiceProvider provider)
{
return _serviceInstance;
}
public Expression Build(Expression provider)
{
return Expression.Constant(_serviceInstance, _serviceType);
}
}
调用的代码:
//Empty: Array.CreateInstance(itemType, 0);
object emptyIEnumerableOrNull = GetEmptyIEnumerableOrNull(serviceType);
if (emptyIEnumerableOrNull != null)
{
return new EmptyIEnumerableCallSite(serviceType, emptyIEnumerableOrNull);
}
TransientCallSite 代码如下:
private class TransientCallSite : IServiceCallSite
{
private readonly IServiceCallSite _service;
public TransientCallSite(IServiceCallSite service)
{
_service = service;
}
public object Invoke(ServiceProvider provider)
{
//在返回对象前 把对象放到 _disposables 一个列表中 以便释放资源
return provider.CaptureDisposable(_service.Invoke(provider));
}
public Expression Build(Expression provider)
{
return Expression.Call(
provider,
CaptureDisposableMethodInfo,
_service.Build(provider));
}
}
调用的代码如下:
IServiceCallSite serviceCallSite = service.CreateCallSite(this, callSiteChain);
if (service.Lifecycle == LifecycleKind.Transient)
{
return new TransientCallSite(serviceCallSite);
}
else if (service.Lifecycle == LifecycleKind.Scoped)
{
return new ScopedCallSite(service, serviceCallSite);
}
else
{
return new SingletonCallSite(service, serviceCallSite);
}
ScopedCallSite 代码如下:
private class ScopedCallSite : IServiceCallSite
{
private readonly IService _key;
private readonly IServiceCallSite _serviceCallSite;
public ScopedCallSite(IService key, IServiceCallSite serviceCallSite)
{
// 为什么多一个 key ? 因为有可能已经创建过了 需要先查找判断
_key = key;
_serviceCallSite = serviceCallSite;
}
public virtual object Invoke(ServiceProvider provider)
{
object resolved;
lock (provider._sync) //private readonly object _sync = new object();
{
if (!provider._resolvedServices.TryGetValue(_key, out resolved))
{
//找不到 这里需要调用 同样要考虑到资源的释放
resolved = provider.CaptureDisposable(_serviceCallSite.Invoke(provider));
// 创建好后 还需要放到已经创建的列表中
provider._resolvedServices.Add(_key, resolved);
}
}
return resolved;
}
//---------这列省略了 Build 方法
}
SingletonCallSite 继承了 ScopedCallSite 代码如下:
private class SingletonCallSite : ScopedCallSite
{
public SingletonCallSite(IService key, IServiceCallSite serviceCallSite) : base(key, serviceCallSite)
{
}
public override object Invoke(ServiceProvider provider)
{
// 所有的 Singleton 对应同一个 ServiceProvider
// Scope 则不同 不同的范围对应的不一样
return base.Invoke(provider._root);
}
public override Expression Build(Expression provider)
{
return base.Build(Expression.Field(provider, "_root"));
}
}
浙公网安备 33010602011771号