方法就是返回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扩展方法,本质是调用的IServiceScopeFactory
的CreateScope
方法 。
经验总结扩展阅读
- asp.net core web 解决方案多项目模板制作打包总结
- ubuntu-22.04 树莓派Zero 2 W通过.NET6和libusb操作USB读写
- 上 学习ASP.NET Core Blazor编程系列六——新增图书
- Azure DevOps Pipelines部署.Net Core 应用到Kubernetes
- 记一次 .NET 某企业OA后端服务 卡死分析
- .NET 采用 SkiaSharp 生成二维码和图形验证码及图片进行指定区域截取方法实现
- .Net CLR异常简析
- 记一次 .NET 某电子病历 CPU 爆高分析
- .NET 7 RC 2 发布,倒计时一个月发布正式版
- .NET MAUI 社区工具包 1.3版本发布