我有一個簡單的兩個聚合根和一個正則實體的檢查域。 Tenant
,UserGroup
和User
這種特定樣品中Tenant
和User
彌補兩個AggregateRoots。域事件處理程序什麼時候開始使用?
當從UI /服務層接收到命令時,它會到達操作只寫域的命令處理程序。
可以說,User
不應該是一個AggregateRoot可言,但因爲它會被別人引用,它不可能是一個普通的實體。 (是的?)
這兩個AggregateRoot需要進行通信。 A User
不能在不屬於UserGroup
的情況下創建,該UserGroup
是Tenant
的有界上下文中的實體。據推測,我們可以通過構造函數創建一個User,因爲它是一個簡單的約束。 User.Create(TenantId, UserGroupId)
它生成一個帶有Date,AggregateVersion和AggregateId(用戶)的DomainEvent
。現在我們到了模糊的部分。
打開提交此事件到商店,此事件廣播到公共汽車(內存,無論)。這就是域的事件處理程序(類似於命令處理程序)捕獲創建的用戶並通知/操縱Tenant
的UserGroup
以添加UserId
?
我的想法是解決這個問題的方向是完全錯誤的嗎?
您可以通過重新考慮您的模型來簡化您的問題。當您需要跨界有限的上下文通信時,或者您希望支持業務邏輯(例如電子郵件通信)來響應域事件時,域事件會很有幫助。你的模型是否需要多個有界的上下文?您是否可以在服務層中包含所有必需的操作,例如UserService? – eulerfx
你應該經常檢查你是否不能模擬這個問題。然而,在這種情況下,它是一個人爲的例子,旨在獲得關於不同有界AR之間的通信應如何發生的答案。 – Jaapjan
「UserGroup中的未來行爲需要UserId?」是一個非常重要的問題(否則你爲什麼要在聚合之間進行交流)。如果您的域名不是多租戶(不要與多租戶混淆爲非功能性需求),讓租戶成爲您域名的一部分似乎很奇怪。如果他們在同一個BC中,請使用您的域對象與一些TDA進行協作。 –