2014-09-27 28 views
1

目前,我正在構建一個PHP應用程序,其中包含CQRS,ES和DDD的想法。讓我們考慮這個包含5個問題的調查應用程序。參與者可以通過回答5個問題來回答調查問卷。CQRS + PHP:發生事件時的邏輯放置位置

可以從正確的順序從閱讀方查詢5個問題。但是,一個問題可以有條件。例如,當B回答問題1時,不要顯示問題2.答案1B,下一個問題將是:3,4和5.

客戶端可以觸發命令AnswerQuestion ,處理程序將處理該命令,並觸發事件QuestionAnswered。基於該事件,事件處理程序將更新讀取端,並且客戶端可以查詢要提出的下一個問題。當問題沒有更多問題時,參與者將完成參與(並且可以參加新的參與)。

調查中的邏輯將根據給定的答案決定要問哪些問題,哪些不是,這是純粹的域邏輯。 我正在努力放置/應用這個邏輯。還有何時決定參與何時完成。我認爲最可能的答案是:讓調查AR根據參與的給定答案確定下一個問題。或者,分享服務中的邏輯,讓讀方查詢問題並給出答案,並將共享邏輯應用於此。

你能幫助我嗎?提前致謝!

+0

如果你可以請讓我知道,如果我需要擴大我的答案的任何領域,或者如果答案不是你正在尋找考慮創造一個賞金,以吸引注意力。 – g18c 2014-10-06 05:28:28

回答

0

據我瞭解,你有幾個領域中的概念在這裏(原諒的術語,一個領域的專家發言加以調整):

  • 問題(問題被問)的關係(一個問題之間)
  • 調查(AR,由多個問題的,並且包含
  • 關係映射)
  • 提交調查

您還有問題回答時的事件。

在放置邏輯,我會做的條款如下:

的應用服務將腳手架全部爲表示層所需的部分(讓我們假設這將是通過Web API調用)。

在應用程序服務上,我會提供整個請求的調查(通過調查名稱從存儲庫獲取)並將其傳遞給客戶端。

客戶端將處理關係映射,並可能顯示當前可用問題,具體取決於通過Angular或Knockout進行的當前選擇。

如果您不想在客戶端上存儲狀態,我會根據當前選擇獲取所有可用選項的列表(每當您的更改發生時,您都會要求提供這個新的可用選項列表客戶)。

當決定一項調查完成:

您可能必須這樣做時,它知道在客戶端上的一些狀態(當所有可用的問題已經回答了這個問題會知道)。

在服務器上處理時,您需要通過構建您的域對象並確認調查已完成,並且如果存儲了提交的調查,需要對其進行驗證。

幾個要點:

我實在不明白怎麼事件採購或CQRS在這裏解決問題,或者是這個學習的目的呢?

您可能希望通過忘記現在讀取的模型,以及從存儲庫中補充Survey(無論是通過事件存儲,ORM還是讀取模型並不重要)來簡化它 - 讀取模型用於構建客戶端查詢事件流意味着重放所有事件的視圖(geteventstore.com有一些稱爲投影的東西,可以在運行中構建這些視圖)。

事件採購非常強大,可以深入瞭解業務,在本例中我可以認爲將所選問題存儲爲一系列事件,您可以瞭解人們響應速度的快慢,他們改變主意的次數等

+0

謝謝!錯過了這篇文章,對不起。這是一個真正的應用程序,不只是學習的目的。使用CQRS的全部想法就是您可以從中得到的統計數據就像您在最後一段中所說的那樣!你爲我做了一些更清楚的事情。我想我會將所有給出的答案存儲在讀取方面,再加上下一個問題(目前還沒有答案)。客戶可以瀏覽回答的問題並獲得最後一個問題。當域名決定所有需要回答的問題時,將在讀取端設置一個標誌。 – 2014-10-08 07:54:30