DDD - 域实体(聚合)与另一个实体的大量集合
DDD - Domain entity(aggreagate) with large collection of another entity
在下面的场景中
class Group {
...
Set<User> users;
...
}
其中用户数为 6 位,可以安全地假设直接使用任何 ORM 对集合执行任何操作都是低效的(JPA/Hibernate in Java,可能是与休眠的 ExtraLazyCollection 一起工作)。
为了处理这种情况,是否可以将聚合和组合实体之间的域关系表示为集合,而不是将其表示为由 DomainService 支持并随后由存储库支持的操作。
class Group {
User addUser(User anUser, GroupUserService aGroupUserService){ ... }
void removeUser(User anUser, GroupUserService aGroupUserService){ ... }
}
class GroupUserService {
GroupRepository groupRepository;
User addUser(User anUser) {
groupRepository.addUser(anUser);
}
}
class GroupRepository {
User addUser(User anUser) {
//execute the query(JQL or native) to save the user
}
}
在不违反 DDD 原则的情况下,这听起来像是一个合理的解决方案吗?在这种情况下是否存在被忽视的优化。
看来你可能漏掉了GroupMember
的概念。
GroupMember member = group.addUser(user);
groupMemberRepository.add(member);
现在,您可能会说 "you cannot have duplicate group memberships" 等不变量不能以强一致的方式强制执行,因为不存在围绕所有成员资格的边界的聚合根。
虽然业务规则确实不能在域中强制执行,但您可以简单地依赖数据库中的唯一约束(假设存储机制支持它们)。
这是我们可以做出的妥协,以便保持高度一致并保持实用性,而不是成为一个纯粹主义者。
但是,还有另一种选择,但需要进行深入的业务分析。我们往往倾向于将业务规则视为数学模型,但现实生活往往不能这样建模。
拥有重复会员资格有哪些风险和影响?这可以简单地手动识别和更正吗?能否使这条规则最终保持一致(自动化过程消除重复项)?这种情况多久发生一次?
我相信这些是您需要回答的问题,您通常会意识到业务通常比您想象的更灵活,最终一致性通常是一个可行的解决方案。
在下面的场景中
class Group {
...
Set<User> users;
...
}
其中用户数为 6 位,可以安全地假设直接使用任何 ORM 对集合执行任何操作都是低效的(JPA/Hibernate in Java,可能是与休眠的 ExtraLazyCollection 一起工作)。
为了处理这种情况,是否可以将聚合和组合实体之间的域关系表示为集合,而不是将其表示为由 DomainService 支持并随后由存储库支持的操作。
class Group {
User addUser(User anUser, GroupUserService aGroupUserService){ ... }
void removeUser(User anUser, GroupUserService aGroupUserService){ ... }
}
class GroupUserService {
GroupRepository groupRepository;
User addUser(User anUser) {
groupRepository.addUser(anUser);
}
}
class GroupRepository {
User addUser(User anUser) {
//execute the query(JQL or native) to save the user
}
}
在不违反 DDD 原则的情况下,这听起来像是一个合理的解决方案吗?在这种情况下是否存在被忽视的优化。
看来你可能漏掉了GroupMember
的概念。
GroupMember member = group.addUser(user);
groupMemberRepository.add(member);
现在,您可能会说 "you cannot have duplicate group memberships" 等不变量不能以强一致的方式强制执行,因为不存在围绕所有成员资格的边界的聚合根。
虽然业务规则确实不能在域中强制执行,但您可以简单地依赖数据库中的唯一约束(假设存储机制支持它们)。
这是我们可以做出的妥协,以便保持高度一致并保持实用性,而不是成为一个纯粹主义者。
但是,还有另一种选择,但需要进行深入的业务分析。我们往往倾向于将业务规则视为数学模型,但现实生活往往不能这样建模。
拥有重复会员资格有哪些风险和影响?这可以简单地手动识别和更正吗?能否使这条规则最终保持一致(自动化过程消除重复项)?这种情况多久发生一次?
我相信这些是您需要回答的问题,您通常会意识到业务通常比您想象的更灵活,最终一致性通常是一个可行的解决方案。