2014-01-20 90 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是域名?