CQRS-单个命令处理程序?

问题描述 投票:4回答:2

我只是想把头缠在CQRS(/ ES)上。我没有对CQRS做任何认真的事情。可能我现在只是缺少一些非常基本的东西。目前,我正在阅读“探索CQRS和事件源”。关于命令,有一句话使我感到困惑:

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

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

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

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

我认为,这引入了不必要的依赖关系。就CQRS而言,命令不过是发送的消息而已。我不知道为什么此消息应该只有一个处理程序的原因。

有人可以告诉我我在这里想念的吗?可能有一个很好的理由,我现在看不到。

问候

cqrs
2个回答
9
投票

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

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

希望这会有所帮助。


2
投票
想象一下,我有两个组件需要执行一些操作以响应命令(我有两个相同组件的实例还是两个独立组件无关紧要)。然后,我需要创建一个将命令委托给此组件的处理程序。
这是事件的责任。

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

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

© www.soinside.com 2019 - 2024. All rights reserved.