总结在.Net Core体系中IOC一直是核心模块,且关于Scope的作用域的问题,一直会有人产生疑问,想更深刻的了解一下还是得多拿一些时间研究一下 。有些知识不是靠一时半会的学就能牢牢地掌握,需要日常不断的积累和不断的解决问题,才能掌握的更多 。因为设计到的源码比较多,而且不熟悉的话可能不是很好理解,所以还需要平时的积累,积累的越多能解决的问题越多,才能避免入坑 。好了大致总结一下
- 当我们使用
CreateScope()或CreateAsyncScope()创建出ServiceProviderEngineScope或AsyncServiceScope实例的时候,即我们通常描述的作用域 。这个实例里包含了ResolvedServices属性和Disposables属性,分别保存当前作用域内即生命周期为ServiceLifetime.Scoped实例和实现了IDisposable或IAsyncDisposable接口的实例 。
- 使用
GetService()方法在当前作用域内获取实例的时候,会根据服务注册时使用的生命周期判断是否加入到当前作用域里享元的实例 。其中单例来自于根容器,瞬时的每次都需要创建新的实例所以不需要保存,只有生命周期为ServiceLifetime.Scoped才保存 。瞬时的和Scope的对象创建出来的时候都会判断是否实现了IDisposable或IAsyncDisposable接口,如果是则加入到Disposables属性的集合里用于释放 。
- 当前作用域被释放的时候,即调用
IServiceScope实例Dispose()相关方法的时候,会遍历Disposables集合里的对象进行Dispose相关方法调用,并不是回收托管到当前作用域内的对象,因为对象何时被回收取决于GC即垃圾回收机制 。
经验总结扩展阅读
- 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版本发布
