2014-01-20 46 views
5

我想在我的项目中使用CQRS模式的元素。我不知道我是否正确地使用Command and Events。 我不确定的事情是如果事件可以调用命令。为了更好地展示我想要做什么,我将使用图表和示例。CQRS - 可以EventListener调用命令?

这是一个示例:

用户调用TripCreateCommand。 TripCreateCommandHandler完成他的工作并成功发布TripCreatedEvent。

现在我们有两个监听器TripCreatedEvent(听众的执行顺序并不重要)

首先监听器(可以是第二个侦听器后执行):

在trip.author.friends每个用户调用两个Command(命令的顺序是很重要的)

  1. PublishTripOnUserWallCommand
  2. SendNewTripEmailNotificationCommand
  3. SendNewTripPlatformNotification

第二监听器(可以是第一个监听之前执行):

  1. PublishTripOnUserSocials

并且这是示例图:

enter image description here

是这是一个好方法? EventListener是否可以调用Command,或者我可以用其他方式来做?

回答

9

您的问题是关于Mesage驱动架构,它与CQRS一起工作但与CQRS无关。

无论如何,你的图是差不多正确。事件订户/处理程序(我更喜欢这个术语)可以通过服务总线发送新的命令,但这不是一个规则,你应该总是这样做。我直接在事件处理程序中实现了很多功能,虽然probalby会发送一个新的命令更加干净和可靠。这真的取决于我想要做什么。

请注意,消息处理程序(命令或事件)不应该知道其他处理程序。他们应该了解巴士,巴士需要处理。这意味着在您的应用中,事件处理程序会将总线视为依赖关系,创建命令并通过总线发送。事件处理程序本身不知道什么命令处理程序生成事件,并可以“​​回复”它。

通常这些命​​令将被独立处理,并且您不能保证顺序(除非它们被同步处理),所以您可能希望由于第一个命令的处理而发出第二个命令。确实,佐贺可以是这种情况。你正在谈论的只是同步做事,所以你的方法在这种情况下工作,但它可能不可扩展。转移到异步处理将打破此执行流程。但是,你的应用程序可以很好地处理它,而不是每个人都需要twitter。

消息驱动的架构不是简单的和某些情况下(如你想从后端立即响应),它比“标准”的做法相当复杂的实施,至少更加复杂。所以也许对于那些特殊的情况你可能想用'旧'的方式来做。

如果你担心去耦和测试,你仍然可以设计的服务,因为他们的消息处理程序,而是直接使用它们,而不是服务总线。

+0

感谢您的重播!可扩展性是我的项目中最重要的事情之一(我想拥有的水平扩展我的应用程序的能力),所以我一定要asynchornously处理命令。我想使用异步并从c#等待来做到这一点。 – mrrobot

-2

不确定为什么您需要用于执行更新用户墙上信息的命令。为什么你会选择不使用View Model Updater来完成该任务。

发送电子邮件可以被视为命令,但也可以很容易地被视为另一个查看模型更新。

上什么SendNewTripPlatformNotification的目的,所以我不能给任何有建议看不清......

一些,这也可能是一个Saga的候选人。其次,我在图表中错过了你的域名,这是发布任何事件的责任,或者你认为CommandHandler是域名?