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

问题描述 投票:0回答:2

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

这是我的处境:

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

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

ruby-on-rails domain-driven-design cqrs event-sourcing rails-event-store
2个回答
1
投票

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

通常的答案是,域对象的创建是通过“工厂”(参见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

在下一课中,字符串被替换为Value Objects;在这种情况下,TrackingId构造函数和UnLocode构造函数实现工厂角色。然后将值对象传递给changeDestination逻辑。


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.