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