更改services.AddScoped <UnitOfWork>();到services.AddTransient();因为没有处置方法?

时间:2019-10-29 04:01:02

标签: c# asp.net service-locator

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

enter image description here

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

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

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

1 个答案:

答案 0 :(得分:0)

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

有时候,在依赖注入中会使用实现IDisposable的对象(通常是因为它们是具有不受管理资源的外部依赖),但并非总是如此。

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

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

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

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