我只是想把头缠在CQRS(/ ES)上。我没有对CQRS做任何认真的事情。可能我现在只是缺少一些非常基本的东西。目前,我正在阅读“探索CQRS和事件源”。关于命令,有一句话使我感到困惑:
“单个收件人处理命令。”
[我在Greg Young(FakeBus.cs)的CQRS示例应用程序中也看到了这一点,其中为任何命令类型注册了多个命令处理程序时,将引发异常。
对我来说,这表明这是CQRS(或命令?)的基本原则。是什么原因?对我来说,这有点违反直觉。
想象一下,我有两个组件需要执行一些操作以响应命令(我有两个相同组件的实例还是两个独立组件无关紧要)。然后,我需要创建一个将命令委托给这些组件的处理程序。
我认为,这引入了不必要的依赖关系。就CQRS而言,命令不过是发送的消息而已。我不知道为什么此消息应该只有一个处理程序的原因。
有人可以告诉我我在这里想念的吗?可能有一个很好的理由,我现在看不到。
问候
“单个收件人处理命令。,原因是什么?
其根本原因之一是交易的一致性。需要在应用程序的一个离散(和隔离)部分中处理命令,以便可以在单个事务中提交该命令。一旦开始拥有多个处理程序,就几乎不可能将应用程序分发到单个进程之外(并保持事务的一致性)。因此,尽管可以采用这种方式设计,但不建议这样做。希望这会有所帮助。
这是事件的责任。命令必须由一个命令处理程序处理,并且必须更改单个聚合根的状态。然后,聚合根引发一个或多个事件,表明发生了某些情况。这些事件可以具有多个执行所需动作的侦听器。
例如:您有一个
PurchaseGift
命令。您的命令处理程序将加载Purchase
聚合根,并执行引发GiftPurchased
事件的所需操作。您可以具有一个或多个GiftPurchase
事件的侦听器,一个侦听器用于向买家发送电子邮件以确认操作,另一个侦听器用于通过邮件发送礼物。