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

x2b*_*ool 20 c# asp.net asp.net-mvc dependency-injection asp.net-core

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

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

services.AddScoped<FooBarService>();
Run Code Online (Sandbox Code Playgroud)

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

Erk*_*rel 28

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

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

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

创建作用域时,ServiceScopeFactory返回一个新的ServiceScope,它依赖于ServiceProvider和一次性.

ServiceProviderprivate List<IDisposable> _transientDisposables;这使一次性服务时TransientCallSiteinvoke在D CaptureDisposable方法.也ServiceProviderprivate readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>();这使所有服务Scoped.

当生命时间/范围结束时,ServiceScope处理掉.然后它配置ServiceProvider所有处理所有_transientDisposables然后它检查_resolvedServices和处理字典中的一次性服务ServiceProvider.

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

  • @SzymonSasin你能确定Data StoreContext的父类不是Singleton吗?如果其中一个单独的所有子对象也将是单例. (2认同)

Mat*_*nta 7

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


Jam*_*ins 5

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