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

我有一个服务,它使用ASP.NET Core的默认dependency injection容器注入控制器:

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

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

与所有其他DI容器一样,它将为您配置IDisposable实例,并尊重实例的生命周期。

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

编辑 :在官方文件中他们没有提到这一点。 所以让我们检查一下源代码:

创建范围时, ServiceScopeFactory将返回一个新的ServiceScope ,该ServiceScope依赖于ServiceProvider和一次性。

ServiceProvider具有private List _transientDisposables; 当在CaptureDisposable方法中invoke TransientCallSite时,它会保留一次性服务。 ServiceProvider还有private readonly Dictionary _resolvedServices = new Dictionary(); 这为Scoped保留了所有服务。

生命周期/范围完成后, ServiceScope被处置。 然后它处理ServiceProvider ,它处理所有_transientDisposables ,然后检查_resolvedServices并在ServiceProvider的字典中处理一次性服务。

编辑 (13.06.2017):他们现在在官方文件中提到。 处置服务

当使用AddScoped时,设计该对象的生命周期与Request相关联。

我看到没有人提到这一点,但除了在你的类型中实现IDisposable之外,你还可以使用{HttpContext}.Response.RegisterForDispose(objectToDispose) 。 通常,这用于在请求结束时在请求开始时(例如控制器动作)注册对象。