细聊.Net Core中IServiceScope的工作方式( 三 )

CreateScope()方法的定义,在ServiceProviderEngineScope类中[点击查看源码]
internal ServiceProvider RootProvider { get; }public IServiceScope CreateScope() => RootProvider.CreateScope();这里毫无疑问了RootProvider属性里的实例都是来自根容器,而CreateScope()方法则是调用的ServiceProviderCreateScope()方法 。看下ServiceProvider类的CreateScope方法定义[点击查看源码]
private bool _disposed;internal IServiceScope CreateScope(){    //判断当前ServiceProvider是否被释放    if (_disposed)    {        //如果已经释放则直接抛出异常        ThrowHelper.ThrowObjectDisposedException();    }    //创建ServiceProviderEngineScope实例    return new ServiceProviderEngineScope(this, isRootScope: false);}通过上面的代码我们可以看到CreateScope()方法,本质是创建了一个ServiceProviderEngineScope方法实例 。通过创建的这一行代码,好巧不巧又可以得到两个重要的信息 。

  • 一是ServiceProviderEngineScope构造函数的第一个参数,传递的是当前的ServiceProvider实例 。
  • 二是ServiceProviderEngineScope构造函数的第二个参数叫isRootScope值给的是false,说明当前ServiceProviderEngineScope实例不是根作用域,也就是我们说的子作用域 。
大致看一下ServiceProviderEngineScope构造函数的实现[点击查看源码]
internal sealed class ServiceProviderEngineScope : IServiceScope, IServiceProvider, IAsyncDisposable, IServiceScopeFactory{    internal Dictionary<ServiceCacheKey, object> ResolvedServices { get; }    internal object Sync => ResolvedServices;    internal ServiceProvider RootProvider { get; }    public bool IsRootScope { get; }    //IServiceProvider的ServiceProvider属性则是赋值的当前实例    public IServiceProvider ServiceProvider => this;    public ServiceProviderEngineScope(ServiceProvider provider, bool isRootScope)    {        //用来存储当前作用域管理的对象实例        ResolvedServices = new Dictionary<ServiceCacheKey, object>();        //创建当前实例的根容器        RootProvider = provider;        //标识当前作用域是否是根容器        IsRootScope = isRootScope;    }}下大致看一下,因为接下来会涉及到ServiceProviderEngineScope这个类 。到目前为止涉及到了两个比较重要的类ServiceProviderServiceProviderEngineScope,它们都是实现了IServiceProvider接口 。看起来有点乱的样子,不过我们可以姑且这么理解 。ServiceProvider是IServiceProvider的直系实现类,作为IServiceProvider根容器的实现 。ServiceProviderEngineScope是用于,通过IServiceProvider创建作用域时表现出来的实例,也就是非根容器的实例 。
探究获取方法关于上面的介绍,我们其实探究了一点serviceProvider.CreateScope()

经验总结扩展阅读