课件和 Demo 地址
https://gitee.com/geektime-geekbang/NET-Core
作者回复: RequestService是指ASP.NET Core框架为每个HTTP请求创建的子容器,就是当前请求的容器。
作者回复: 是的
作者回复: 对于实现了IDisposable的服务,要避免在跟容器以瞬时服务的方式获取 对于没有实现IDisposable的服务,是没有关系的
作者回复: 大体的理解是对的,更准确一点: 1.IServiceCollection表示我们定义的服务类型、构造方式和生命周期的配置表,IServiceprovider则表示跟容器,当我们调用GetService时,它会根据IServiceCollection中的定义来决定如何构造(或者返回一个已有的)服务对象。 2.容器只会管理实现了IDisposable的服务的释放(调用Dispose方法),对于未实现IDisposable的服务,容器是不管的。 另外对象最终的回收,是由GC完成的。 生命周期的定义,是决定了容器是返回一个新对象,还是复用之前创建的对象。 3.使用IServiceprovider的扩展方法CreateScope来创建子容器。
作者回复: 根容器可以理解为由我们通过ServiceCollection Build出的容器,子容器是由容器创建出来的,其中父容器也可以是其他容器的子容器,也就是孩子的孩子,这个关系是可以一直嵌套下去的
作者回复: 感谢支持
作者回复: 在跟容器获取作用域服务会直接报错
作者回复: 是因为请求的代码里并没有创建瞬时服务,仅仅在启动过程中使用根容器创建了瞬时服务
作者回复: 启动过程是一次性的,启动后,每次请求都会由”一个“线程作处理请求。 你的理解是对的,在请求的处理中不要使用根容器,应该使用scope的容器,否则一样会有问题。
作者回复: 感谢建议,你的理解是对的。 这里核心是不要在请求的代码中使用根容器,要使用requestservice 这种scope容器,否则会有问题