2016-03-08 59 views
0

我有一些用戶數據的RegisterUserCommand。在ES/CQRS中獲取第三方數據的最佳位置

爲了能夠使用一些額外的信息來註冊用戶,我需要連接到第三方所以我的問題是:

1)應該已經命令擁有所有第三方數據調用時?

2)如果CommandHandler連接到第三方並檢索它會好嗎?

3)我不認爲我的聚合根應該這樣做,但從某種意義上說,它是域邏輯。

我認爲#2是最好的方法,但想聽聽我是否會出錯。

(實際情況是不是註冊用戶,但它需要從遠程服務獲取數據/第三方)

+1

爲了將用戶添加到您的域中,信息100%是必需的,那麼命令處理程序應該獲取信息。如果沒有,請將用戶添加到域中,並讓「UserCreated」事件獲取數據。 – janhartmann

+0

是的,第三方數據在這個階段是至關重要的。 BTW。我如何按事件做到這一點?我的意思是,沒有命令(或實際命令處理程序)只有那些應該改變聚集? – Miro

+0

你能提供一些代碼嗎?事實上,這個問題非常模糊。 – theMayer

回答

0

與問題(2)您的域名層(其中命令處理程序絕對屬於)成爲依賴一個外部有界的上下文。這打破了洋蔥結構內層隔離。

對於某些情況,您的第一點基本上是正確的,如果您的服務層可以獲取此數據併發送獨立命令,這是可能的解決方案之一。

另一種不是調用命令處理程序的解決方案,您可以發送消息來啓動一個流程管理器,它將發送信息收集請求,獲取數據併發送命令給您的處理程序並提供所有必需的信息。由於這是通過異步消息傳遞發生的,因此即使第三方出現故障(至少在某種程度上),並且第三方喚醒時,您的第三方也不會有同步依賴關係,並且所有排隊的請求都會被處理。

通常,持久消息傳遞還具有一些重試功能,可以降低對外部有界上下文請求失敗的風險。

0

您的第三方數據不屬於您的域的一部分,但是它是必需的,因此您可以使用導致外部流程訂閱的「數據請求」事件的命令。然後,該過程可以收集所需的第三方數據並將其打包到另一個命令中,從而導致另一個事件指出數據已提供,這會導致您的查詢數據被更新。

相關問題