更改services.AddScoped ();到services.AddTransient();因为没有处理方法?

问题描述 投票:-1回答:1

在实践中的CQRS课程视频中。

enter image description here

在Startup.cs代码中,它具有以下代码。

public void ConfiureServices(IServiceCollection services)
{
    service.AddMvc();
    services.AddScoped<UnitOfWork>();
}

但是,由于services.AddTransient();没有处置方法,因此代码必须是UnitOfWork?为什么UnitOfWork.dispose()需要AddScoped

c# asp.net service-locator
1个回答
0
投票

对象的生存期(范围,瞬时,单例)与该对象是否实现IDisposable是一个完全独立的问题。

有时在依赖关系注入中使用实现IDisposable的对象(通常是因为它们是具有不受管资源的外部依赖关系,但是并非总是那样。)>

AddScoped,在ASP.NET Core的上下文中,意味着在ASP.NET请求的生存期内,将使用相同的对象。

AddTransient,在ASP.NET Core的上下文中,意味着每个对象实例化-即使在同一HTTP请求期间,也将使用该对象的新实例。

对于您的特定问题-工作单位问题,您将要确保在切换到Transient之前,要使用的数据库可以在多个读取器和写入器中都可以正常运行,原因是使用AddTransient,然后如果您多次调用数据库,则将为每个调用打开新事务和(可能)打开连接;并且有些数据库对此不太喜欢(Postgres是一个出色的例子)。

我们用来谈论的术语是Multiple Active Result Sets问题,每个数据库对它的处理方式都不一样。

© www.soinside.com 2019 - 2024. All rights reserved.