protected ServiceProviderEngine(IEnumerable <ServiceDescriptor> serviceDescriptors)
 {
     _createServiceAccessor = CreateServiceAccessor;
     Root            = new ServiceProviderEngineScope(this, isRoot: true);
     RuntimeResolver = new CallSiteRuntimeResolver();
     CallSiteFactory = new CallSiteFactory(serviceDescriptors);
     CallSiteFactory.Add(typeof(IServiceProvider), new ServiceProviderCallSite());
     CallSiteFactory.Add(typeof(IServiceScopeFactory), new ServiceScopeFactoryCallSite());
     RealizedServices = new ConcurrentDictionary <Type, Func <ServiceProviderEngineScope, object> >();
 }
 protected ServiceProviderEngine(IEnumerable <ServiceDescriptor> serviceDescriptors, IServiceProviderEngineCallback callback)
 {
     _createServiceAccessor = CreateServiceAccessor;
     _callback       = callback;
     Root            = new ServiceProviderEngineScope(this); //实例化根容器
     RuntimeResolver = new CallSiteRuntimeResolver();        //实例化 CallSite对象访问者对象
     CallSiteFactory = new CallSiteFactory(serviceDescriptors);
     CallSiteFactory.Add(typeof(IServiceProvider), new ServiceProviderCallSite());
     CallSiteFactory.Add(typeof(IServiceScopeFactory), new ServiceScopeFactoryCallSite());             // 缓存一个ServiceScopeFactoryCallSite服务,相当于缓存一个ServiceProviderEngine,根据此对象进行创建子容器
     RealizedServices = new ConcurrentDictionary <Type, Func <ServiceProviderEngineScope, object> >(); //缓存实例化对象的工厂
 }
예제 #3
0
        private Func <ServiceProviderEngineScope, object> CreateServiceAccessor(Type serviceType)
        {
            var callSite = CallSiteFactory.GetCallSite(serviceType, new CallSiteChain());

            if (callSite != null)
            {
                _callback?.OnCreate(callSite);
                return(RealizeService(callSite));
            }

            return(_ => null);
        }
예제 #4
0
        protected ServiceProviderEngine(IEnumerable <ServiceDescriptor> serviceDescriptors, IServiceProviderEngineCallback callback)
        {
            _createServiceAccessor = CreateServiceAccessor;
            _callback = callback;

            Root              = new ServiceProviderEngineScope(this);
            RuntimeResolver   = new CallSiteRuntimeResolver();
            ExpressionBuilder = new CallSiteExpressionBuilder(RuntimeResolver, this, Root);
            CallSiteFactory   = new CallSiteFactory(serviceDescriptors);
            CallSiteFactory.Add(typeof(IServiceProvider), new ServiceProviderCallSite());
            CallSiteFactory.Add(typeof(IServiceScopeFactory), new ServiceScopeFactoryCallSite());
        }
예제 #5
0
        private Func <ServiceProviderEngineScope, object> CreateServiceAccessor(Type serviceType)
        {
            ServiceCallSite callSite = CallSiteFactory.GetCallSite(serviceType, new CallSiteChain());

            if (callSite != null)
            {
                DependencyInjectionEventSource.Log.CallSiteBuilt(serviceType, callSite);
                _callback?.OnCreate(callSite);
                return(RealizeService(callSite));
            }

            return(_ => null);
        }
예제 #6
0
        private static Func <Type, ServiceCallSite> GetCallSiteFactory(params ServiceDescriptor[] descriptors)
        {
            var collection = new ServiceCollection();

            foreach (var descriptor in descriptors)
            {
                collection.Add(descriptor);
            }

            var callSiteFactory = new CallSiteFactory(collection.ToArray());

            return(type => callSiteFactory.GetCallSite(type, new CallSiteChain()));
        }
예제 #7
0
 protected ServiceProviderEngine(
     IEnumerable <ServiceDescriptor> serviceDescriptors,
     IServiceProviderEngineCallback callback,
     IInterceptingProxyFactory interceptingProxyFactory)
 {
     _createServiceAccessor = CreateServiceAccessor;
     _callback       = callback;
     Root            = new ServiceProviderEngineScope(this);
     RuntimeResolver = new CallSiteRuntimeResolver();
     CallSiteFactory = new CallSiteFactory(serviceDescriptors, interceptingProxyFactory);
     CallSiteFactory.Add(typeof(IServiceProvider), new ServiceProviderCallSite());
     CallSiteFactory.Add(typeof(IServiceScopeFactory), new ServiceScopeFactoryCallSite());
     RealizedServices = new ConcurrentDictionary <Type, Func <ServiceProviderEngineScope, object> >();
 }
예제 #8
0
        private Func <ServiceProviderEngineScope, object> CreateServiceAccessor(Type serviceType) // 这个方法的作用是根据服务类型,创建对应的产生服务实例的委托方法。
                                                                                                  // 这个方法会在 CallSiteFactory 中查找输入服务类型对应的创建服务实例有关的信息。并将得到的 callSite 信息传入由子类实现的 RealizeService 方法。最后将 RealizeService 方法返回。
                                                                                                  // 如果 CallSiteFactory 中没有对应的信息, 就会将 CallSiteFactory 在内部新添加这个信息(运行时动态添加)
        {
            var callSite = CallSiteFactory.GetCallSite(serviceType, new CallSiteChain());

            if (callSite != null)
            {
                _callback?.OnCreate(callSite);
                return(RealizeService(callSite));
            }

            return(_ => null);
        }
예제 #9
0
        public void GetSlotTests(int numberOfServices)
        {
            var serviceDescriptors = new[] {
                ServiceDescriptor.Singleton <ICustomService, CustomService1>(),
                ServiceDescriptor.Singleton <ICustomService, CustomService2>(),
                ServiceDescriptor.Singleton <ICustomService, CustomService3>(),
                ServiceDescriptor.Singleton <ICustomService, CustomService4>(),
                ServiceDescriptor.Singleton <ICustomService, CustomService5>()
            };

            var callsiteFactory = new CallSiteFactory(serviceDescriptors.Take(numberOfServices));

            for (int i = 0; i < numberOfServices; i++)
            {
                Assert.Equal(numberOfServices - i - 1, callsiteFactory.GetSlot(serviceDescriptors[i]));
            }
        }
예제 #10
0
        public void ValidateService(ServiceDescriptor descriptor)
        {
            if (descriptor.ServiceType.IsGenericType && !descriptor.ServiceType.IsConstructedGenericType)
            {
                return;
            }

            try
            {
                ServiceCallSite callSite = CallSiteFactory.GetCallSite(descriptor, new CallSiteChain());
                if (callSite != null)
                {
                    _callback?.OnCreate(callSite);
                }
            }
            catch (Exception e)
            {
                throw new InvalidOperationException($"Error while validating the service descriptor '{descriptor}': {e.Message}", e);
            }
        }
        private void ResolveSingletonServices(IEnumerable <ServiceDescriptor> serviceDescriptors)
        {
            var callSite = CallSiteFactory.CreateCallSite(typeof(IServiceProvider), new CallSiteChain());

            if (callSite != null)
            {
                RuntimeResolver.Resolve(callSite, Root);
            }

            callSite = CallSiteFactory.CreateCallSite(typeof(IServiceScopeFactory), new CallSiteChain());
            if (callSite != null)
            {
                RuntimeResolver.Resolve(callSite, Root);
            }

            foreach (var descriptor in serviceDescriptors.Where(sd => sd.Lifetime == ServiceLifetime.Singleton && !sd.ServiceType.IsGenericTypeDefinition))
            {
                callSite = CallSiteFactory.CreateCallSite(descriptor.ServiceType, new CallSiteChain());
                if (callSite != null)
                {
                    RuntimeResolver.Resolve(callSite, Root);
                }
            }
        }