DDD - 乐观并发属性(etag 或时间戳)是否应该成为域的一部分?

dee*_* zg 5 domain-driven-design

从理论上讲,如果我们在聚合根级别实现乐观并发(更改 AR 中的实体会更改 AR 上的版本),并且假设我们使用时间戳作为版本属性(只是为了简单起见) - 时间线应该是 AR 上的属性还是应该是一侧和另一侧的读取模型的一部分(例如更新)是应用程序服务的单独参数,例如:

[伪]

public class AppService{
.
.
.
   public void UpdateSomething(UpdateModelDTO model, int timestamp)
   {
      repository.GetModel(model.Identifier);
      model.UpdateSomething(model.something);
      repository.ConcurrencySafeModelUpdate(model, timestamp);
   }
}
Run Code Online (Sandbox Code Playgroud)

我看到两者的优点/缺点,但想知道哪个是按书本解决方案?

[更新]

为了回答@guillaume31的问题,我预计通常的情况是:

  1. 读取时,版本标识符被读取并发送给客户端
  2. 更新时,客户端发回标识符,如果版本标识符不相同,存储库将返回某种错误。

我不知道它是否重要,但我想将创建/更新版本标识符本身的责任留给我的数据库系统。

gui*_*e31 1

没有按书本解决方案。有时,您的聚合中已经有一个非常适合该角色的字段(例如LastUpdatedOn),有时您可以将其设为非域数据。出于性能原因,选择字段作为获取聚合的同一查询的一部分可能是一个好主意。

一些 ORM 提供了检测并发冲突的工具。某些 DBMS 可以自动为您创建和更新版本列。您可能应该在特定堆栈中寻找有关乐观并发的指南。