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 关注
- 262 浏览
添加回答
举报
