【问题标题】:Where to create Value Objects in CQRS & DDD flow在 CQRS 和 DDD 流中创建值对象的位置
【发布时间】:2020-01-10 13:17:44
【问题描述】:

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

这是我的情况:

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

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

【问题讨论】:

  • 请在您的标题中扩展 CQRS 和 DDD。添加一个你正在做什么的例子,并阐明你想要达到的目标。
  • CQRS 和 DDD 是著名的概念,您建议如何扩展。我已经解释了我正在做的步骤,最后我的问题。我真的不能在这里粘贴我的代码。
  • 域模型的初始化应该在像工厂或建造者这样的域服务中实现。它们应该位于您的核心域中,尤其是在 domain-services 目录中。

标签: ruby-on-rails domain-driven-design cqrs event-sourcing rails-event-store


【解决方案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 逻辑。

【讨论】:

  • 我也可以使用骨料里面的工厂吗?因为我不想暴露聚合方法的内部。那么,如果我通过工厂来聚合​​数据并将数据提供给来自工厂/构建器的事件?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2021-04-07
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-31
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多