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和一次性.
ServiceProvider
有 private List<IDisposable> _transientDisposables;
这使一次性服务时TransientCallSite
是invoke
在D CaptureDisposable
方法.也ServiceProvider
有private readonly Dictionary<IService, object> _resolvedServices = new Dictionary<IService, object>();
这使所有服务Scoped
.
当生命时间/范围结束时,ServiceScope
处理掉.然后它配置ServiceProvider
所有处理所有_transientDisposables
然后它检查_resolvedServices
和处理字典中的一次性服务ServiceProvider
.
编辑(13.06.2017):他们现在在官方文件中提到.处置服务
我发现还没有人提到这一点,但除了IDisposable
在您的类型中实现之外,您还可以使用{HttpContext}.Response.RegisterForDispose(objectToDispose)
. 通常,这用于在请求开始时注册一个对象(例如控制器操作),以便在请求结束时进行处理。
归档时间: |
|
查看次数: |
8648 次 |
最近记录: |