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