我想在我的项目中使用CQRS模式的元素。我想知道我是否使用Command and Events做得对。 我不确定的是事件是否可以调用命令。为了更好地展示我想做什么,我将使用图表和示例。
这是一个例子:
用户调用TripCreateCommand。 TripCreateCommandHandler完成他的工作,并在成功发布TripCreatedEvent。
现在我们有两个TripCreatedEvent监听器(监听器执行的顺序无关紧要)
第一个侦听器(可以在第二个侦听器之后执行):
为trip.author.friends中的每个用户调用两个Command(命令的顺序很重要)
第二个侦听器(可以在第一个侦听器之前执行):
这是示例图:
这是一个好方法吗? EventListener可以调用Command,或者我应该以其他方式执行它吗?
答案 0 :(得分:9)
您的问题是与Mesage驱动架构有关,但与CQRS无关,但与之无关。
无论如何,你的图表几乎正确。事件订阅者/处理程序(我更喜欢这个术语)可以通过服务总线发送新的命令,但是总是执行此操作并不是一个规则。我直接在事件处理程序中实现了很多功能,尽管probalby在发送新命令时会更加干净和可靠。这实际上取决于我想做什么。
请注意,消息处理程序(命令或事件)不应该知道其他处理程序。他们应该知道公共汽车和公共汽车负责处理。这意味着在您的应用程序中,事件处理程序将把总线作为依赖项,创建命令并通过总线发送它。事件处理程序本身不知道命令处理程序生成了什么事件,并且可以“回复”它。
通常命令会被独立处理,你不能保证顺序(除非它们是同步处理的),所以你可能希望第二个命令是由第一个命令处理后发出的。事实上,佐贺可能就是这种情况。
AFAIK你只是在谈论同步做事,所以你的方法适用于这种情况,但它可能无法扩展。转向异步处理将破坏此执行流程。但是你的应用程序可以很好用,不是每个人都需要推特。
消息驱动的体系结构不是那么简单,对于某些情况(就像你想要后端立即响应),实现起来相当复杂,至少比使用“标准”方法更复杂。因此,对于那些特殊情况,您可能希望以“旧”方式进行。
如果您担心脱钩和测试,您仍然可以设计服务,因为它们是消息处理程序,但是直接使用它们而不是服务总线。
答案 1 :(得分:-2)
不确定为什么需要使用命令来更新用户墙上的信息。为什么您选择不使用View Model Updater来完成该任务。
发送电子邮件可以被视为一个命令,但也可以轻松地被视为另一个视图模型更新。
不清楚SendNewTripPlatformNotification的用途是什么,所以我不能在那里提出任何建议......
其中一些也可能是Saga的候选人。其次,我在图中遗漏了你的域名,那应该负责发布任何事件,或者你认为CommandHandler是域名?