我是DDD的新手,我被困在这里: 我在两个实体之间存在多对多关系:用户和组。该关系不是聚合,因为用户可以在没有组的情况下存在,并且没有用户就可以存在组。
这是我的用户类代码:
public class User {
private List<Group> groups = new ArrayList<Group>();
private UserRepository userRepository;
public void create() throws Exception{
userRepository.create(this);
// I have to update the groups with the user.
for (Group group : groups) {
group.update();
}
}
public void addGroup(Group group){
if (!groups.contains(group)) {
groups.add(group);
group.addUser(this);
}
}
}
问题是,当我创建一个具有组的用户(我不能使用ORM)时,我不知道将这些类关联到何处。我在User的create方法中创建它,并通过Spring管理那里的事务。它是否正确?或者我应该将该代码放在userRepository或服务中吗?
谢谢!
答案 0 :(得分:0)
1)创建一个用户工厂,该工厂可以接收应与新用户关联的组。工厂可以使用addGroup方法进行关联。
2)从User类中删除对UserRepository的引用。
答案 1 :(得分:0)
我在User的create方法中创建了它,并通过Spring管理那里的事务。它是否正确?
这种逻辑的正确性取决于存储库的编写方式和合同。如果存储库不会保留任何关系,那么它可能是设计不良的存储库的标志。我希望存储库能够实现存储实体关联的必要逻辑,而不仅仅是实体的简单属性。
基于ORM解决方案的存储库可以通过级联持久性事件使这更容易,但在您的情况下,它可能会导致两个存储库中的代码重复(我假设您有{{1同样)。如果您决定哪个实体拥有该关系,然后通过相应的存储库保持关联,则可能会更好。因此,关联中的任何更改都应仅由拥有关联的实体(在您的案例中看起来为GroupRepository
)进行,并且通过推断,User
应该管理关联。
答案 2 :(得分:0)
根据Eric Evans的书,很多很多协会都会让你的模型过于复杂。尝试用它们替换它们 2个多对一的关联。多对多关联的一部分总是有更多 商业价值高于其他。
在您的情况下,我会留下2个聚合 - User
和Group
,其中User
聚合负责持有GroupReferences
一堆。