Exemple #1
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()));
        }
        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);
        }
Exemple #3
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);
        }
Exemple #4
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);
            }
        }