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> >(); //缓存实例化对象的工厂 }
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); }
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()); }
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); }
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())); }
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> >(); }
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); }
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])); } }
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); } } }