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

标签 c# asp.net asp.net-mvc dependency-injection asp.net-core

我有一个使用 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/35872163/

相关文章:

c# - 如何使用 c#.net 从组合框中的 sql server 获取所有数据库的列表

c# - 我应该在 C# 中使用 Enum 类还是 Lookup

ASP.NET MVC4 自动映射器 : Loses mapping when reach a Controller

c# - 来自 sql 表的 TreeView

javascript - ASP .net 不触发提交事件

asp.net-mvc - 将 Visual Studio Code 与非核心 Asp.Net MVC 结合使用

c# - 保存文件更改后的 Visual Studio 2017 文件图标

c# - Microsoft.Speech SpeechRecognitionEngine.setInputToDefaultAudioDevice() 方法抛出 System.InvalidOperationException

c# - Mvc Asp 排序项目

c# - 获取抛出异常的方法名