DependencyInjection源码解读之ServiceProvider

var services = new ServiceCollection();
var _serviceProvider = services.BuildServiceProvider();
serviceScope = _serviceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope()
var internalServiceProvider = serviceScope.ServiceProvider;
上面几行代码内部发生了什么?
 
要弄清这个过程,咱们先得了解一下ServiceProvider建立过程.
ServiceProvider  有两个构造方法,一个用来建立Root ServiceProvider ,和个用来建立 Not Root ServiceProvider。
为了方便称呼,咱们把它们称为 RootServiceProvider和 InternalServiceProvider 
 
构造方法一,用来建立一个rootServiceProvider,Root属性指向本身。
internal ServiceProvider(IEnumerable<ServiceDescriptor> serviceDescriptors, ServiceProviderOptions options)
{
    Root = this;

    if (options.ValidateScopes)
    {
        _callSiteValidator = new CallSiteValidator();
    }

    _table = new ServiceTable(serviceDescriptors);

    _table.Add(typeof(IServiceProvider), new ServiceProviderService());
    _table.Add(typeof(IServiceScopeFactory), new ServiceScopeService());
    _table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table));
}
 
构造方法二,用来建立一个InternalServiceProvider,Root属性指向传入的ServiceProvider(竟然能够单性繁殖)。
internal ServiceProvider(ServiceProvider parent)
{
    Root = parent.Root;
    _table = parent._table;
    _callSiteValidator = parent._callSiteValidator;
}

 

注意:RootServiceProvider 和 InternalServiceProvider 并无什么本质上的不一样,但仍是有两点区别:
1.RootServiceProvider 的 Root 属性指向的是本身,而 InternalServiceProvider 指向的是 RootServiceProvider
2.RootServiceProvider  建立时会建立一个新的ServiceTable,并注册三个默认的依赖服务。
_table = new ServiceTable(serviceDescriptors);
//注入默认的依赖注入,这样才能在使用 _serviceProvider.GetRequiredService<IServiceScopeFactory>() 或在建立对象时为构造方法中的IServiceProvider 注入实例。
_table.Add(typeof(IServiceProvider), new ServiceProviderService()); 
_table.Add(typeof(IServiceScopeFactory), new ServiceScopeService());
_table.Add(typeof(IEnumerable<>), new OpenIEnumerableService(_table));

 

回到最上面的几行代码,跟据参数能够看到。
BuildServiceProvider() 建立的是 RootServiceProvider,  serviceScope.ServiceProvider 建立的是 InternalServiceProvider
具体过程为:
// BuildServiceProvider() 是扩展方法,有三个重载
//最终实现方法定义:this IServiceCollection services, ServiceProviderOptions options
//其中services是当前扩展的IServiceCollection,options是一些可选扩展选项
BuildServiceProvider() == new ServiceProvider(services, options); 

_serviceProvider.GetRequiredService<IServiceScopeFactory>();
//这一句获取一个ServiceScopeFactory实例,IServiceScopeFactory咱们上面说过了,建立RootServiceProvider时内部注册的。

// CreateScope() 
// CreateScope()是在IServiceScopeFactory接口内定义,ServiceScopeFactory类的实现为:
//return new ServiceScope(new ServiceProvider(_provider)); 
//其中_provider参数类型为ServiceProvider,是ServiceScopeFactory类的一个字段,其值来自构造方法注入
CreateScope() == new ServiceScope(new ServiceProvider(_provider));

 

须要注意的是,它们所在方法接收的参数 IServiceCollection  仍是 ServiceProvider
若是接收的是IServiceCollection,是能够直接转化为 IEnumerable<ServiceDescriptor>的。由于IServiceCollection 是一个继承自 IList<ServiceDescriptor>的空接口。
因此BuildServiceProvider()所在方法接收的参数 IServiceCollection services 直接转化为构造方法一所须要的 IEnumerable<ServiceDescriptor> serviceDescriptors 
相关文章
相关标签/搜索