Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Dependency injection .NET核心依赖注入实例何时处置?_Dependency Injection_Asp.net Core_.net Core_Idisposable - Fatal编程技术网

Dependency injection .NET核心依赖注入实例何时处置?

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实际被调用时 是否需要添加任何内容(例如异常处理)以确保始终

ASP.NET Core使用
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是的,它是内部的,但从技术上讲,这对同一程序集中的其他类型是公开的。