ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider
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
存放服務注冊的集合
ServiceCollection
它是對IServiceCollection接口的默認實現,
核心屬性private readonly List<ServiceDescriptor> _descriptors = new List<ServiceDescriptor>();
可以說是對List的一個包裝類。
ServiceLifetime
用於描述服務聲明周期的枚舉 Singleton
、Scoped
、Transient
ServiceDescriptor
用於描述服務的注冊信息
屬性,后三個為提供的的服務實際類有關。
ServiceType
服務類型Lifetime
生命周期Type ImplementationType
Func<IServiceProvider,object> ImplementationFactory
object ImplementationInstance
它還提供了一系列靜態方法供用於創建ServiceDescriptor
- ServiceDescriptor.Transient
transientService = ServiceDescriptor.Transient(typeof(ICar), typeof(Car));
- ServiceDescriptor Describe
例如ServiceDescriptor.Transient
transientService = ServiceDescriptor.Describe(typeof(ICar), typeof(Car), ServiceLifetime.Transient);
多數情況下是使用
ServiceCollectionServiceExtensions
為IServiceCollection
擴展的一系列方法添加服務到IServiceCollection集合。
ServiceCollectionServiceExtensions
作為IServiceCollection提供了一系列添加服務注冊信息到IServiceCollection集合集合內,內部基本都是創建對應的ServiceDescriptor然后調用IServiceCollection.Add方法添加到集合內。
IServiceProviderFactory
IServiceProvider
的工廠接口默認實現為DefaultServiceProviderFactory
DefaultServiceProviderFactory
IServiceProvider
的工廠類
構造函數
public DefaultServiceProviderFactory() : this(ServiceProviderOptions.Default)
public DefaultServiceProviderFactory(ServiceProviderOptions options)
兩個方法public IServiceCollection CreateBuilder(IServiceCollection services)
public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder)
它的內部CreateServiceProvider也是調用的ServiceCollectionContainerBuilderExtensions
提供的擴展方法。
ServiceCollectionContainerBuilderExtensions
對IServiceCollection的擴展作用就是創建IServiceProvider例如提供了BuildServiceProvider
IServiceProvider
僅有的一個方法為用於獲取服務。object? GetService(Type serviceType);
ServiceProvider是它的默認實現
ServiceProvider`
ServiceProviderOptions
-
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章節