在“实践中的CQRS”课程的视频中。
在Startup.cs代码中,它具有以下代码。
public void ConfiureServices(IServiceCollection services)
{
service.AddMvc();
services.AddScoped<UnitOfWork>();
}
但是,由于services.AddTransient();
没有处置方法,因此代码必须是UnitOfWork
?为什么UnitOfWork.dispose()
需要AddScoped
?
答案 0 :(得分:0)
对象(作用域,瞬态,单例)的生存期与该对象是否实现IDisposable是一个完全独立的问题。
有时候,在依赖注入中会使用实现IDisposable的对象(通常是因为它们是具有不受管理资源的外部依赖),但并非总是如此。
AddScoped
,在ASP.NET Core的上下文中,意味着在ASP.NET请求的生存期内,将使用同一对象。
AddTransient
,在ASP.NET Core的上下文中,意味着每个对象实例化-即使在同一HTTP请求期间,都将使用该对象的新实例。
对于您的特定问题-工作单元问题,您将需要确保在切换到Transient
之前,可以使用具有多个读取器和写入器的任何数据库都是可以的,原因是您正在使用AddTransient
,那么,如果您对数据库进行多次调用,则将为每个调用打开新的事务和(可能)打开连接;并且有些数据库对此不太喜欢(Postgres是一个出色的例子)。
我们用来谈论的术语是Multiple Active Result Sets
问题,每个数据库对它的处理方式都不一样。