2 回答

TA貢獻1868條經驗 獲得超4個贊
所有頂級實體都是聚合根。在您當前的設計中,UserEntity
和SettingsEntity
是有效的聚合根 (AR)。AR 是事務性和一致性邊界。AR 的作用是確保與它們封裝的數據相關的不變量永遠不會被破壞,即使通過并發也是如此。
AR 應該設計得盡可能小,因為它們可以防止對它們保護的數據進行并發修改。為了從 AR 模式中受益,您必須努力將 AR 視為事務邊界,因此對于大多數用例(可能存在例外),嘗試只修改每個事務的單個 AR。但是,該規則在創建 AR 時并不適用,因為在創建時并發沖突不應該是常見的。
這里有兩種顯而易見的潛在設計,正確的一種取決于實際的業務不變量和您想要做出的妥協。
User
并且Settings
具有交叉不變量,這意味著不變量User
可能取決于狀態,Settings
反之亦然。在這種情況下User
,并且Settings
必須是同一一致性邊界的一部分。您很可能擁有User
AR 和Settings
生活在User
.User
并且Settings
可以獨立進化(除了他們的創造)。在這種情況下,您很可能希望將User
和Settings
作為自己獨立的 AR,但在同一個事務中創建兩者(或不創建 - 最終一致性)。請注意,在 AR 上使用工廠方法來創建另一個工廠方法通常很優雅。transaction { user = new User(…) settings = user.initSettings(...) userRepository.save(user); settingsRepository.save(settings);}
從那時起,
User
將Settings
在不同的事務中進行修改。
PS:我建議刪除諸如“實體”之類的技術前綴。語言是 DDD 的關鍵,我懷疑領域專家在他們的語言中使用“UserEntity”(甚至可能不是“User”)或“SettingsEntity”這個詞。

TA貢獻1752條經驗 獲得超4個贊
這取決于它是否是新用戶。
如果它是現有用戶,則處理它的一種方法是使用存儲庫“水合”用戶和存儲中的設置。然后修改。
如果是新用戶,您可以使用工廠實例化聚合根(用戶實體)并使用符合 UL 的工廠方法從輸入生成設置。
擁有用戶對象后,將其發送到存儲庫以進行持久化。
- 2 回答
- 0 關注
- 211 瀏覽
添加回答
舉報