GOF 中的命令模式 vs CQRS 含义

Boa*_*ler 7 design-patterns command-pattern cqrs

在查看命令模式时,发现略有不同。也许有些能够更清楚地说明这一点。

当查看四人组时,它说每个命令都有一个执行方法,例如:http : //www.blackwasp.co.uk/Command.aspx, 例如:

myCommand.Execute(myValue);
Run Code Online (Sandbox Code Playgroud)

现在,当我查看如何在CQRS (Greg Young)中使用的命令时,我发现该命令没有执行方法。它们只是某种“命令指令”实例。在 CQRS 网络广播中也说了类似的话。

该命令由域对象处理。喜欢

class myDomainObject
{
    void UpdateValue(UpdateValueCommand cmd){
        this.value = cmd.value;
    }
}
Run Code Online (Sandbox Code Playgroud)

它只是另一个像“CQRS-Command Pattern”这样的 CommandPattern 定义,对吗?所以当谈到一个命令时,它在“common”或“cqrs”上下文中的含义可能略有不同?还是我错过了命令模式或 CQRS 实现?

jlv*_*ero 6

好问题。

原始形式的命令模式就像 GOF 所说的那样。

在 CQRS 中,命令只是一个 DTO(数据传输对象),因为在大多数情况下,CQRS 是通过处理命令的事件或消息总线实现的。在 CQRS 中,您将命令发送到系统,系统具有某种总线或事件架构,允许自治组件订阅来处理命令;通过这种方式,您可以创建一个责任链,并且它更可靠,例如,使用读写模型。

它更像是命令模式的责任链模式,但您保留了命令模式的优势,因为您仍然拥有命令,并且可以像命令模式一样轻松地实现 UNDO 操作。

链接可以帮助您更好地了解 CQRS。

  • 我想你可能指的是消息总线,而不是 ESB。后者似乎与 cqrs 关系不大 (2认同)
  • @jlvaquero 我认为该命令不是 DTO,但命令只是一种写入方法。您可以在没有任何事件/消息总线的情况下使用 CQRS。CQRS 只是将写入方法与读取方法分离/隔离。如果您在非基于 RPC 的系统中将命令视为 DTO,您最终会得到大量重复的代码。原始 CQRS 和 CQS 描述中的命令不是模型 (2认同)

GC.*_*GC. 5

这是在 DDD/CQRS 讨论组中提出的,由 Greg Young 回答:

命令模式有多种定义。

您正在查看命令消息模式。唯一的区别是 GoF 将命令的处理与命令本身结合起来。如果在层边界上使用该命令,结果证明这不是一个好主意,因为您的架构和处理是捆绑在一起的

https://groups.google.com/forum/?hl=en#!topic/dddcqrs/Yfrt4OqPUD0