我一直在寻找不同的方法CQRS samples
,其中大多数使用不保存的命令处理程序UnitOfWork
(即DataContext
在 的情况下Entity Framework
)。像这样的东西:
public void Handle(Command message)
{
var course = Mapper.Map<Command, Course>(message);
_db.Courses.Add(course);
}
处理请求时,保存(和事务提交)通常在后台发生。
我从许多领先的 CQRS 专家那里看到了这种方法,但我从未听说过它的推理。
这种方法的最大问题是当您需要在处理程序调用返回后立即获取实体 ID(这种情况经常发生)。显然有一些方法可以解决它(即使用 Guid,从您的数据库中预先请求唯一的 Id 等),但看起来很笨拙。
但是这种方法的优点是什么?从理论上讲,如果我们每个请求有多个处理程序,则不进行多次数据库往返可能会有所帮助。但它不会发生很多。我想到的另一个优点是我们不必键入例行的 Save 调用并让它自动发生。这有点好,但它是否加重了 ID 生成问题?