CreateScope()方法的定义,在ServiceProviderEngineScope类中[点击查看源码]
internal ServiceProvider RootProvider { get; }public IServiceScope CreateScope() => RootProvider.CreateScope();这里毫无疑问了RootProvider属性里的实例都是来自根容器,而CreateScope()方法则是调用的ServiceProvider的CreateScope()方法 。看下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实例不是根作用域,也就是我们说的子作用域 。
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这个类 。到目前为止涉及到了两个比较重要的类ServiceProvider和ServiceProviderEngineScope,它们都是实现了IServiceProvider接口 。看起来有点乱的样子,不过我们可以姑且这么理解 。ServiceProvider是IServiceProvider的直系实现类,作为IServiceProvider根容器的实现 。ServiceProviderEngineScope是用于,通过IServiceProvider创建作用域时表现出来的实例,也就是非根容器的实例 。探究获取方法关于上面的介绍,我们其实探究了一点
serviceProvider.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版本发布
