ASP.NET Core使用IServiceCollection
上的扩展方法来设置依赖注入,然后当需要类型时,它使用适当的方法来创建新实例:
AddTransient<T>
- 添加每次请求时再次创建的类型。AddScoped<T>
- 添加为请求范围保留的类型。AddSingleton<T>
- 在第一次请求时添加一个类型并保留它。我有类型实现IDisposable
并且如果没有处理会导致问题 - 在实际调用Dispose
的每种模式中?
我是否需要添加(例如异常处理)以确保实例始终处理?
答案 0 :(得分:33)
已解析的对象与其容器具有相同的生命周期/处置周期,除非您使用using
语句或.Dispose()
方法在代码中手动处理瞬态服务。
在ASP.NET Core中,您将获得一个作用域容器,该容器根据请求进行实例化,并在请求结束时进行处理。此时,由此容器创建的范围和瞬态依赖关系也将被处理(即如果它们实现IDisposable
接口),您也可以在源代码here上看到它。
public void Dispose()
{
lock (ResolvedServices)
{
if (_disposeCalled)
{
return;
}
_disposeCalled = true;
if (_transientDisposables != null)
{
foreach (var disposable in _transientDisposables)
{
disposable.Dispose();
}
_transientDisposables.Clear();
}
// PERF: We've enumerating the dictionary so that we don't allocate to enumerate.
// .Values allocates a ValueCollection on the heap, enumerating the dictionary allocates
// a struct enumerator
foreach (var entry in ResolvedServices)
{
(entry.Value as IDisposable)?.Dispose();
}
ResolvedServices.Clear();
}
}
当父容器被处置时,单身人士会被处置,通常意味着当应用程序关闭时。
TL; DR :只要您在应用程序启动期间(使用app.ApplicationServices.GetService<T>()
)没有实例化范围/临时服务,并且您的服务正确实现了Disposable接口(如pointed in MSDN你没有什么需要照顾的。
父容器在Configure(IApplicationBuilder app)
方法之外是不可用的,除非你做一些时髦的事情让它在外面可以访问(你不应该这样做)。
当然,它鼓励尽快释放瞬态服务,特别是如果他们消耗了大量资源。