【问题标题】:Calling one command from other in case of using CQRS在使用 CQRS 的情况下从另一个命令调用一个命令
【发布时间】:2018-06-04 19:39:29
【问题描述】:

我正在使用 CQRS 开发应用程序。我有一些我有点困惑的情况。

我有一个命令 CreateUser。现在我必须创建命令 ImportUsers。我想这些命令的目的很明确。所以有两种选择:

  1. 从 ImportUsers 命令调用 CreateUser 命令。
  2. 在 ImportUsers 命令中进行复制/粘贴以从头开始执行所有操作。

最佳做法是什么?先感谢您。

【问题讨论】:

  • 虽然我没有 CQRS 的实践经验(不得不承认我什至不得不用谷歌搜索),但我肯定会说选项 1。“复制粘贴代码”通常意味着“难以维护”代码”。
  • 您的架构中有一些不清楚的地方。 CreateUser 命令将由单个聚合(用户聚合)处理。但是,ImportUsers 命令不能由单个用户聚合处理(因为Users 表示多个用户)。这表明这里还涉及另一种聚合类型。其他聚合类型是什么? ImportUsers 命令的一致性要求是什么?它必须是原子的(所有用户都被导入或没有)?能否最终保持一致(最终导入所有用户)?
  • 感谢您的评论。我想如果你建议引入新的聚合,这意味着系统将具有完全一致,它就像我的第二个选项一样?如果最终一致 - 这是第一个选择。
  • 满意后别忘了选择答案

标签: php cqrs


【解决方案1】:

您将逻辑放在错误的位置,这就是导致问题的原因。命令旨在成为域逻辑的协调器。换句话说,他们在域中调用适当的方法来完成他们的工作,而不是他们自己去做。

创建单个用户的逻辑属于每个方法调用的工厂。工厂应该有一个 CreateUser 方法,该方法接受所有数据作为参数,或者如果有超过 5 个左右的参数(我假设有),则接受 DTO。使用工厂创建用户,这两个命令的唯一区别是 ImportUsers 会循环调用工厂的 CreateUser 方法。

检查this posting 关于命令背后的想法。如果您使用的是 DDD,请阅读Udi Dahan's post,了解所有对象创建应该如何在某个聚合的某个方法中。

【讨论】:

  • 顺便说一句,如果您的系统是基于消息的,甚至是基于事件的,ImportUsers 命令的最佳工作方式是将一系列 UserCreationRequested 事件放在队列中并让它们以正常方式处理.
  • 感谢您的回复。让我展示一下我的命令处理程序。 pastebin.com/8JZhA2as因为我真的必须使用那里的工厂吗?
  • 工厂有几个优点,所以总的来说它们是个好主意,但我不能说你“必须使​​用”工厂。最初的问题提到了您对“复制/粘贴从头开始做所有事情”的担忧。我推断创建用户涉及到很多代码。复制/粘贴命令的基本代码很好 - ImportUsers 是一个不同的命令,应该有它自己的类和代码。您复制/粘贴的唯一重要代码是单行 User 构造函数,这不是问题。
  • 我明白了。谢谢你的时间:)
猜你喜欢
  • 1970-01-01
  • 2020-10-09
  • 2017-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
相关资源
最近更新 更多