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


总结在.Net Core体系中IOC一直是核心模块,且关于Scope的作用域的问题,一直会有人产生疑问,想更深刻的了解一下还是得多拿一些时间研究一下 。有些知识不是靠一时半会的学就能牢牢地掌握,需要日常不断的积累和不断的解决问题,才能掌握的更多 。因为设计到的源码比较多,而且不熟悉的话可能不是很好理解,所以还需要平时的积累,积累的越多能解决的问题越多,才能避免入坑 。好了大致总结一下

  • 当我们使用CreateScope()CreateAsyncScope()创建出ServiceProviderEngineScopeAsyncServiceScope实例的时候,即我们通常描述的作用域 。这个实例里包含了ResolvedServices属性和Disposables属性,分别保存当前作用域内即生命周期为ServiceLifetime.Scoped实例和实现了IDisposableIAsyncDisposable接口的实例 。
  • 使用GetService()方法在当前作用域内获取实例的时候,会根据服务注册时使用的生命周期判断是否加入到当前作用域里享元的实例 。其中单例来自于根容器,瞬时的每次都需要创建新的实例所以不需要保存,只有生命周期为ServiceLifetime.Scoped才保存 。瞬时的和Scope的对象创建出来的时候都会判断是否实现了IDisposableIAsyncDisposable接口,如果是则加入到Disposables属性的集合里用于释放 。
  • 当前作用域被释放的时候,即调用IServiceScope实例Dispose()相关方法的时候,会遍历Disposables集合里的对象进行Dispose相关方法调用,并不是回收托管到当前作用域内的对象,因为对象何时被回收取决于GC即垃圾回收机制 。

经验总结扩展阅读