2 回答
TA貢獻1868條經驗 獲得超4個贊
所有頂級實體都是聚合根。在您當前的設計中,UserEntity和SettingsEntity是有效的聚合根 (AR)。AR 是事務性和一致性邊界。AR 的作用是確保與它們封裝的數據相關的不變量永遠不會被破壞,即使通過并發也是如此。
AR 應該設計得盡可能小,因為它們可以防止對它們保護的數據進行并發修改。為了從 AR 模式中受益,您必須努力將 AR 視為事務邊界,因此對于大多數用例(可能存在例外),嘗試只修改每個事務的單個 AR。但是,該規則在創建 AR 時并不適用,因為在創建時并發沖突不應該是常見的。
這里有兩種顯而易見的潛在設計,正確的一種取決于實際的業務不變量和您想要做出的妥協。
User并且Settings具有交叉不變量,這意味著不變量User可能取決于狀態,Settings反之亦然。在這種情況下User,并且Settings必須是同一一致性邊界的一部分。您很可能擁有UserAR 和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 關注
- 222 瀏覽
添加回答
舉報
