每当我需要单例或后台服务中的临时服务或范围服务时,我都会在子范围内创建它们:
using var serviceScope = _serviceScopeFactory.CreateScope();
var foo = serviceScope.ServiceProvider.GetRequiredService<Foo>();
然而我刚刚注意到状态的 API 文档CreateScope
:
返回:控制范围生命周期的 IServiceScope。一旦处置该服务,任何已从 IServiceScope.ServiceProvider 解析的范围服务也将被处置。
注意措辞“任何范围的服务”。
这是否意味着作用域容器不会释放临时服务(仅释放作用域服务)?我一直认为子容器会释放其创建的所有内容,只有根容器会保留临时引用。
(我习惯使用 Autofac,它和 .NET DI 之间的一些细微差别有点令人困惑。)
文档这部分的措辞并不完全正确,至少对于默认的 DI 容器来说是这样 - 当范围被释放时,它将释放范围本身拥有/控制/构建的所有依赖项。检查起来相当容易:
并引用文档: