在 CQRS 和 DDD 流中创建值对象的位置

Where to create Value Objects in CQRS & DDD flow

我在命令的生命周期中努力构建 ValueObjects。

这是我的情况:

  1. 命令请求到达控制器动作。
  2. 使用请求参数创建命令对象。
  3. 将命令对象传递给应用服务
  4. 命令处理程序首先验证命令属性
  5. 然后创建聚合并将命令属性传递给聚合函数。
  6. 和聚合函数将属性传递给域事件。

我的问题是我应该在哪里放置对象创建逻辑。或者换句话说,DDD 的哪个组件负责初始化对象(值对象、实体等)以供聚合使用?

您可以将领域模型的创建委托给其他服务,实际上它们是领域服务的一部分。您可以将一些原始数据或 DTO 传递给他们,最后,您可以期待他们的有效域模型。我可以提到的常见模式是工厂模式或构建器模式,通常,它们使用域模型的受保护构造函数来创建新的域模型。请注意,您的域模型的构造函数应该是受包保护的,并且只有您的域服务可以创建您的域模型。这意味着您的域模型的构造函数不应从核心域之外访问,并且为了创建域模型,您可以将域服务(工厂、构建器)注入用例或应用程序服务。

My question is where I should put Object Creation logic. or in other words which component of DDD is responsible for initialisation of Objects (Value Objects, Entities etc.) for Aggregates to work with?

通常的答案是领域对象的创建是通过 "factories" 发生的(参见 Evans,第 6 章),它们通常从领域模型中导出并由需要它们的应用程序代码调用。

工厂本身可能是一个对象,或者它只是一个函数,甚至是一个构造函数。

Citerus 对 DDDSample 的评论可能有助于说明:

https://github.com/citerus/dddsample-core/blob/master/src/main/java/se/citerus/dddsample/interfaces/booking/web/CargoAdminController.java#L133

在这里,控制器提取必要的数据(作为原语)并将该信息传递给 changeDestination 逻辑。

https://github.com/citerus/dddsample-core/blob/master/src/main/java/se/citerus/dddsample/interfaces/booking/facade/internal/BookingServiceFacadeImpl.java#L74

在接下来的class中,Strings被替换为Value Objects;在这种情况下,TrackingId 构造函数和 UnLocode 构造函数实现了工厂角色。然后将值对象传递给 changeDestination 逻辑。