CQRS - 单命令处理程序?

时间:2014-02-04 22:49:18

标签: cqrs

我只是想绕过CQRS(/ ES)。我没有对CQRS做过任何严肃的事情。可能我现在缺少一些非常基本的东西。目前我正在阅读“探索CQRS和事件采购”。有一句话在命令方面让我感到困惑:

“单个收件人处理命令。”

我在Greg Young(FakeBus.cs)的CQRS示例应用程序中也看到了这一点,当为任何命令类型注册了多个命令处理程序时,会抛出异常。

对我而言,这表明这是CQRS(或命令?)的基本原则。是什么原因?对我来说,这有点违反直觉。

想象一下,我有两个组件需要执行一些操作以响应命令(如果我有两个相同组件或两个独立组件的实例,则无关紧要)。然后我需要创建一个将命令委托给这个组件的处理程序。

在我看来,这是一种不必要的依赖。就CQRS而言,命令只不过是发送的消息。我不明白为什么这个消息应该只有一个处理程序。

有人能告诉我这里缺少什么吗?可能有一个非常好的理由,我现在才看到。

此致

2 个答案:

答案 0 :(得分:9)

我自己并不是CQRS的专家,但也许我可以帮助解决一些问题。

  

“单个收件人处理命令。”,原因是什么?

其中一个根本原因是交易一致性。命令需要在应用程序的一个离散(和隔离)部分中处理,以便可以在单个事务中提交它。一旦开始拥有多个处理程序,将应用程序分配到单个进程之外(并保持事务一致性)几乎是不可能的。所以,虽然你可以这样设计,但不建议这样做。

希望这有帮助。

答案 1 :(得分:2)

  

想象一下,我有两个组件需要执行一些操作以响应命令(如果我有两个相同组件或两个独立组件的实例,则无关紧要)。然后我需要创建一个将命令委托给这个组件的处理程序。

这是事件的责任。

命令必须由一个命令处理程序处理,并且必须更改单个聚合根的状态。然后聚合根引发一个或多个事件,指示发生了某些事情。这些事件可以有多个侦听器来执行所需的操作。

例如:您有一个PurchaseGift命令。您的命令处理程序加载Purchase聚合根并执行引发GiftPurchased事件的所需操作。您可以为GiftPurchase活动提供一个或多个听众,一个用于向买方发送确认操作的电子邮件,另一个用于通过邮件发送礼物。