Net6 DI源碼分析Part1 ServiceCollection、ServiceDescriptor、ServiceLifetime、IServiceProvider


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

用於描述服務聲明周期的枚舉 SingletonScopedTransient

ServiceDescriptor

用於描述服務的注冊信息
屬性,后三個為提供的的服務實際類有關。

  1. ServiceType服務類型
  2. Lifetime生命周期
  3. Type ImplementationType
  4. Func<IServiceProvider,object> ImplementationFactory
  5. object ImplementationInstance

它還提供了一系列靜態方法供用於創建ServiceDescriptor

  1. ServiceDescriptor.Transient
    transientService = ServiceDescriptor.Transient(typeof(ICar), typeof(Car));
  2. ServiceDescriptor Describe
    例如ServiceDescriptor.Transient
    transientService = ServiceDescriptor.Describe(typeof(ICar), typeof(Car), ServiceLifetime.Transient);

多數情況下是使用ServiceCollectionServiceExtensionsIServiceCollection擴展的一系列方法添加服務到IServiceCollection集合。

ServiceCollectionServiceExtensions

作為IServiceCollection提供了一系列添加服務注冊信息到IServiceCollection集合集合內,內部基本都是創建對應的ServiceDescriptor然后調用IServiceCollection.Add方法添加到集合內。

IServiceProviderFactory

IServiceProvider的工廠接口默認實現為DefaultServiceProviderFactory

DefaultServiceProviderFactory

IServiceProvider的工廠類
構造函數

  1. public DefaultServiceProviderFactory() : this(ServiceProviderOptions.Default)
  2. public DefaultServiceProviderFactory(ServiceProviderOptions options)
    兩個方法
  3. public IServiceCollection CreateBuilder(IServiceCollection services)
  4. public IServiceProvider CreateServiceProvider(IServiceCollection containerBuilder) 它的內部CreateServiceProvider也是調用的ServiceCollectionContainerBuilderExtensions提供的擴展方法。
ServiceCollectionContainerBuilderExtensions

對IServiceCollection的擴展作用就是創建IServiceProvider例如提供了BuildServiceProvider

IServiceProvider

僅有的一個方法為用於獲取服務。object? GetService(Type serviceType);ServiceProvider是它的默認實現ServiceProvider`

ServiceProviderOptions
  1. ValidateScopes 驗證服務之前的Scopes依賴:例如 Singleton 服務依賴另一個Scoped服務,那么這個Scoped服務實例將被一個Singleton服務實例所引用,這時候此Scoped服務實例成了一個Singleton服務實例,如果設置為True ServiceProvider的構造方法內會創建一個CallSiteValidator對象給自己的_callSiteValidator屬性。 驗證動作會在當Provider獲取到CallSiteSerivce后對其進行驗證。

  2. 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章節


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM