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

方法就是返回AsyncServiceScope实例,接下来来看一下这个类的定义[点击查看源码]
public readonly struct AsyncServiceScope : IServiceScope, IAsyncDisposable{    private readonly IServiceScope _serviceScope;    public AsyncServiceScope(IServiceScope serviceScope)    {        //AsyncServiceScope也是IServiceScope实例构建起来的        _serviceScope = serviceScope ?? throw new ArgumentNullException(nameof(serviceScope));    }    //ServiceProvider也是直接在IServiceScope实例中直接获取的    public IServiceProvider ServiceProvider => _serviceScope.ServiceProvider;    //同步释放    public void Dispose()    {        _serviceScope.Dispose();    }    //异步释放    public ValueTask DisposeAsync()    {        //因为IAsyncDisposable的ServiceProvider能继续创建作用域        //使用CreateScope或CreateAsyncScope方法        if (_serviceScope is IAsyncDisposable ad)        {            return ad.DisposeAsync();        }        _serviceScope.Dispose();        return default;    }}通过源码我们可以看到AsyncServiceScope本身是包装了IServiceScope实例,它本身也是实现了IServiceScope接口并且同时IAsyncDisposable接口以便可以异步调用释放 。相信大家都知道,实现了IDispose接口可以使用using IServiceScope scope = HttpContext.RequestServices.CreateScope()的方式,它编译完之后其实是
IServiceScope scope = HttpContext.RequestServices.CreateScope();try{  //具体操作}finally{    scope.Dispose();}实现了IAsyncDisposable接口可以使用await using (AsyncServiceScope scope2 = scopeProvider.CreateAsyncScope())的方式,它编译完的代码则是
AsyncServiceScope scope2 = scopeProvider.CreateAsyncScope();try{  //具体操作}finally{    await scope2.DisposeAsync();}打消了这个疑虑,相信大家对它们的关系有了了解,本质就是包装了一下IServiceScope实例 。
由创建开始接下来我们可以专心的看一下IServiceScope相关的实现,IServiceScope的创建则是来自IServiceProvider的扩展方法CreateScope(),首先看下它的定义[点击查看源码]
public static IServiceScope CreateScope(this IServiceProvider provider){    return provider.GetRequiredService<IServiceScopeFactory>().CreateScope();}好吧,短短的一行代码,我们可以得到两个比较重要的信息

  • 首先获取到的IServiceScopeFactory实例,看过上篇文章的可以知道,默认情况通过IServiceScopeFactory实例获取的是根容器的实例 。
  • 其次IServiceProvider的CreateScope扩展方法,本质是调用的IServiceScopeFactoryCreateScope方法 。
接下来我们就看看下IServiceScopeFactory默认实现类中关于

经验总结扩展阅读