Microsoft.Extensions.DependencyInjection.Abstractions
Microsoft.Extensions.DependencyInjection
class Car : ICar { } interface ICar { }
IServiceCollection services = new ServiceCollection(); ServiceDescriptor transientService = new ServiceDescriptor(typeof(ICar), typeof(Car), ServiceLifetime.Transient); services.Add(transientService); services.AddTransient<ICar, Car>(); var serviceProvider = services.BuildServiceProvider(); var car = serviceProvider.GetService(typeof(ICar));
存放服务注册的集合
它是对IServiceCollection接口的默认实现,
核心属性private readonly List<ServiceDescriptor> _descriptors = new List<ServiceDescriptor>();
可以说是对List的一个包装类。
用于描述服务声明周期的枚举 Singleton
、Scoped
、Transient
用于描述服务的注册信息
属性,后三个为提供的的服务实际类有关。
ServiceType
服务类型Lifetime
生命周期Type ImplementationType
Func<IServiceProvider,object> ImplementationFactory
object ImplementationInstance
它还提供了一系列静态方法供用于创建ServiceDescriptor
transientService = ServiceDescriptor.Transient(typeof(ICar), typeof(Car));
ServiceDescriptor.Transient
transientService = ServiceDescriptor.Describe(typeof(ICar), typeof(Car), ServiceLifetime.Transient);
多数情况下是使用
ServiceCollectionServiceExtensions
为IServiceCollection
扩展的一系列方法添加服务到IServiceCollection集合。
作为IServiceCollection提供了一系列添加服务注册信息到IServiceCollection集合集合内,内部基本都是创建对应的ServiceDescriptor然后调用IServiceCollection.Add方法添加到集合内。
IServiceProvider
的工厂接口默认实现为DefaultServiceProviderFactory
IServiceProvider
的工厂类
构造函数
public DefaultServiceProviderFactory() : this(ServiceProviderOptions.Default)
public DefaultServiceProviderFactory(ServiceProviderOptions options)
public IServiceCollection CreateBuilder(IServiceCollection services)
public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder)
它的内部CreateServiceProvider也是调用的ServiceCollectionContainerBuilderExtensions
提供的扩展方法。对IServiceCollection的扩展作用就是创建IServiceProvider例如提供了BuildServiceProvider
仅有的一个方法为用于获取服务。object? GetService(Type serviceType);
ServiceProvider是它的默认实现
ServiceProvider`
ValidateScopes
验证服务之前的Scopes依赖:例如 Singleton 服务依赖另一个Scoped服务,那么这个Scoped服务实例将被一个Singleton服务实例所引用,这时候此Scoped服务实例成了一个Singleton服务实例,如果设置为True
ServiceProvider
的构造方法内会创建一个CallSiteValidator
对象给自己的_callSiteValidator属性。 验证动作会在当Provider获取到CallSiteSerivce后对其进行验证。
ValidateOnBuild
IServiceProvider
对象被构建的时候会检验提供的每个ServiceDescriptor 的有效性 例如注册的Car
没有一个可以用的构造函数 class Car : ICar { private Car() { } }
的情况 。如果设置为True
此时在buildServicePrivate时会抛出异常,否则需要等GetService时才会抛出异常。这是因为这个验证是在CallSiteFactory.GetCallSite
动作里面做的,当设置为true是 也只是在ServiceProvider
构造函数内调用了ValidateService
方法该方法循环调用CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
,也就是说把,ServiceCallSite
的创建动作提前。注意GetCallSite是个重载方法。具体区别会写在CallSiteFactory章节