06-004 DependencyInjection 之 IServiceCallSite(3)
Posted on 2015-03-25 13:51 DotNet1010 阅读(78) 评论(0) 收藏 举报还有如下几个类也实现了接口IServiceCallSite:
internal class FactoryService : IService, IServiceCallSite{}
internal class InstanceService : IService, IServiceCallSite{}
internal class ServiceProviderService : IService, IServiceCallSite{}
internal class ServiceScopeService : IService, IServiceCallSite{}
FactoryService 中的Invoke 和 Build 方法:
public object Invoke(ServiceProvider provider)
{
return _descriptor.ImplementationFactory(provider);
}
public Expression Build(Expression provider)
{
Expression<Func<IServiceProvider, object>> factory =
serviceProvider => _descriptor.ImplementationFactory(serviceProvider);
return Expression.Invoke(factory, provider);
}
调用的方法 只有存在ImplementationFactory 的情况下 才会创建FactoryService 代码如下 :
else if (descriptor.ImplementationFactory != null)
{
Add(descriptor.ServiceType, new FactoryService(descriptor));
}
再看一下 InstanceService 逻辑是直接返回 实例:
public object Invoke(ServiceProvider provider)
{
return _descriptor.ImplementationInstance;
}
public Expression Build(Expression provider)
{
return Expression.Constant(_descriptor.ImplementationInstance, _descriptor.ServiceType);
}
调用的代码:
else if (descriptor.ImplementationInstance != null)
{
Add(descriptor.ServiceType, new InstanceService(descriptor));
}
继续看一下 ServiceScopeService 代码如下:这个主要和 Scope 声明周期有关
public object Invoke(ServiceProvider provider)
{
return new ServiceScopeFactory(provider);
}
public Expression Build(Expression provider)
{
return Expression.New(
typeof(ServiceScopeFactory).GetTypeInfo()
.DeclaredConstructors
.Single(),
provider);
}
调用的代码:
public ServiceProvider(IEnumerable<IServiceDescriptor> 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));
}
ServicePrividerService 对应的代码如下:调用的代码见上方代码:
public object Invoke(ServiceProvider provider)
{
return provider;
}
public Expression Build(Expression provider)
{
return provider;
}
浙公网安备 33010602011771号