GOF 中的命令模式与 CQRS 的含义

Command Pattern in GOF vs CQRS meanings

在查看命令模式时发现了细微的差别。可能有些人能够更清楚地说明这一点。

在查看《四人帮》时,它说每个命令都有一个 Execute 方法,例如:http://www.blackwasp.co.uk/Command.aspx 喜欢:

myCommand.Execute(myValue);

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

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

class myDomainObject
{
    void UpdateValue(UpdateValueCommand cmd){
        this.value = cmd.value;
    }
}

它只是另一个像 "CQRS-Command Pattern" 这样的 CommandPattern 定义对吗?因此,当谈论命令时,它在 "common" 或 "cqrs" 上下文中可能具有轻微的不同含义?还是我遗漏了命令模式或 CQRS 实现?

好问题。

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

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

它更像是一个 chain of responsibility pattern 命令模式,但你保留了命令模式的优点,因为你仍然有命令,例如,可以像在命令模式中一样轻松地执行 UNDO 操作。

本文link可以帮助您更好地理解CQRS。

这出现在 DDD/CQRS 讨论组,Greg Young 的回答:

There are multiple definitions of the command pattern.

You are looking at the Command Message pattern. The only difference is GoF combines the handling of the command with the Command itself. If using the command over a tier boundary this turns out to be a not-so-great idea as your schema and handling are tied together

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