我有一个使用 ASP.NET Core 的默认依赖注入(inject)容器注入(inject)到 Controller 中的服务:
public class FooBarService : IDisposable {
public void Dispose() { ... }
}
services.AddScoped<FooBarService>();
这会为每个请求创建一个实例。如何确保框架在每个请求结束时处理 FooBarService 实例,而不依赖于析构函数和垃圾收集?
最佳答案
与所有其他 DI 容器一样,它会根据实例的生命周期为您处理 IDisposable 实例。
在您的情况下,如果实例注册为 Scoped
(每个请求的实例)。它将在请求完成后处理此实例。
编辑: 在官方文件中,他们没有提到这一点。 因此,让我们检查源代码以确保:
创建范围时,ServiceScopeFactory返回一个新的 ServiceScope这取决于 ServiceProvider和一次性的。
ServiceProvider
有private List<IDisposable> _transientDisposables;
TransientCallSite
时保持一次性服务是invoke
d CaptureDisposable
方法。还有 ServiceProvider
有private readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>();
为 Scoped
保留所有服务.
liftime/scope 结束时,ServiceScope
被处置。然后它处理 ServiceProvider
处理所有 _transientDisposables
然后它检查 _resolvedServices
并在字典中配置一次性服务 ServiceProvider
.
编辑(13.06.2017):他们现在在官方文件中提到。 Service Lifetimes
关于c# - 如何在请求结束时释放资源并在 ASP.NET 5/Core 中处理注入(inject)的服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35872163/