ASP.NET Core 使用扩展方法IServiceCollection
设置依赖注入,然后当需要类型时,它使用适当的方法创建一个新实例:
-
AddTransient<T>
- 添加每次请求时再次创建的类型。
-
AddScoped<T>
- 添加为请求范围保留的类型。
-
AddSingleton<T>
- 在第一次请求时添加类型并保留它。
我有实现的类型IDisposable
如果不处理它们就会导致问题 - 在每种模式中Dispose
真的打电话了?
是否需要添加任何内容(例如异常处理)以确保实例始终被释放?
解析的对象与它们的容器具有相同的生命周期/处置周期,除非您使用以下命令在代码中手动处置瞬态服务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 接口(例如MSDN中指出)没有什么需要你照顾的。
父容器在以下时间之外不可用Configure(IApplicationBuilder app)
方法,除非你做了一些时髦的事情来使其可以在外部访问(无论如何你不应该这样做)。
当然,我们鼓励尽快释放临时服务,尤其是在它们消耗大量资源的情况下。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)