导航

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;
        }