gpt4 book ai didi

c# - 如何在请求结束时释放资源并在 ASP.NET 5/Core 中处理注入(inject)的服务?

转载 作者:行者123 更新时间:2023-11-30 18:19:04 26 4
gpt4 key购买 nike

我有一个使用 ASP.NET Core 的默认依赖注入(inject)容器注入(inject)到 Controller 中的服务:

public class FooBarService : IDisposable {
public void Dispose() { ... }
}

services.AddScoped<FooBarService>();

这会为每个请求创建一个实例。如何确保框架在每个请求结束时处理 FooBarService 实例,而不依赖于析构函数和垃圾收集?

最佳答案

与所有其他 DI 容器一样,它会根据实例的生命周期为您处理 IDisposable 实例。

在您的情况下,如果实例注册为 Scoped (每个请求的实例)。它将在请求完成后处理此实例。

编辑:在官方文件中,他们没有提到这一点。因此,让我们检查源代码以确保:

创建范围时,ServiceScopeFactory返回一个新的 ServiceScope这取决于 ServiceProvider和一次性的。

ServiceProviderprivate List<IDisposable> _transientDisposables; TransientCallSite时保持一次性服务是invoke d CaptureDisposable方法。还有 ServiceProviderprivate 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/39860711/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com