Dependency injection .NET核心依赖注入实例何时处置?
ASP.NET Core使用Dependency injection .NET核心依赖注入实例何时处置?,dependency-injection,asp.net-core,.net-core,idisposable,Dependency Injection,Asp.net Core,.net Core,Idisposable,ASP.NET Core使用IServiceCollection上的扩展方法来设置依赖项注入,然后在需要类型时使用适当的方法来创建新实例: AddTransient-添加一个类型,该类型在每次请求时都会再次创建 AddScoped-添加为请求范围保留的类型 AddSingleton-在第一次请求类型时添加该类型并保留该类型 我有一些类型实现了IDisposable,如果它们没有被释放,就会导致问题——在每一种模式中,当Dispose实际被调用时 是否需要添加任何内容(例如异常处理)以确保始终
IServiceCollection
上的扩展方法来设置依赖项注入,然后在需要类型时使用适当的方法来创建新实例:
-添加一个类型,该类型在每次请求时都会再次创建AddTransient
-添加为请求范围保留的类型AddScoped
-在第一次请求类型时添加该类型并保留该类型AddSingleton
IDisposable
,如果它们没有被释放,就会导致问题——在每一种模式中,当Dispose
实际被调用时
是否需要添加任何内容(例如异常处理)以确保始终处理实例?解析的对象与其容器具有相同的生命周期/处置周期,除非您使用
using
语句或.dispose()
方法在代码中手动处置临时服务
在ASP.NET Core中,您将获得一个作用域容器,该容器在每个请求中实例化,并在请求结束时释放。此时,此容器创建的作用域依赖项和临时依赖项也将被释放(如果它们实现了IDisposable
接口),您也可以在源代码中看到这一点
public void Dispose()
{
锁定(解析服务)
{
如果(_处置)
{
返回;
}
_disposeCalled=true;
如果(_transientDisposables!=null)
{
foreach(var可在_瞬态可处置设备中一次性使用)
{
一次性的,一次性的;
}
_可暂时处置的;
}
//性能:我们已经枚举了字典,所以我们不需要分配给枚举。
//.Values在堆上分配ValueCollection,枚举字典分配
//结构枚举器
foreach(ResolvedServices中的var条目)
{
(entry.Value作为IDisposable)?.Dispose();
}
ResolvedServices.Clear();
}
}
当父容器被释放时,单例被释放,通常意味着应用程序关闭时
TL;DR:只要您在应用程序启动期间(使用app.ApplicationServices.GetService()
)不实例化作用域/临时服务,并且您的服务正确地实现了一次性接口(如),您就不需要管理任何事情
父容器在Configure(iaapplicationbuilder-app)
方法之外不可用,除非您做了一些奇怪的事情使其在外部可访问(无论如何都不应该这样)
当然,鼓励尽快释放临时服务,特别是如果它们消耗大量资源的话 不相关,但看到
lock
被用于公共可见的属性(ResolvedServices
在本例中),我有点震惊,我一直认为这是违反建议的。@StevenRands:ResolvedServices
是matter@Tseng是的,它是内部的,但从技术上讲,这对同一程序集中的其他类型是公开的。