我目前正在大量使用 DDD,并且在从其他聚合根加载/操作聚合根时遇到问题。
对于模型中的每个聚合根,我也有一个存储库。存储库负责处理根的持久性操作。
假设我有两个聚合根,有一些成员(实体和值对象)。
AggregateRoot1 和 AggregateRoot2。
AggregateRoot1 有一个引用 AggregateRoot2 的实体成员。
- 当我加载 AggregateRoot1 时,我是否也应该加载 AggregateRoot2?
- AggregateRoot2 的存储库应该对此负责吗?
- 如果是这样,AggregateRoot1 中的实体是否可以调用 AggregateRoot2 的存储库进行加载?
另外,当我在 AggregateRoot1 中的实体与 AggregateRoot2 之间创建关联时,应该通过实体还是通过 AggregateRoot2 的存储库来完成?
希望我的问题有意义。
[编辑]
当前解决方案
在Twith2Sugars的帮助下,我提出了以下解决方案:
如问题中所述,聚合根可以具有引用其他根的子级。将 root2 分配给 root1 的成员之一时,root1 的存储库将负责检测此更改,并将其委托给 root2 的存储库。
public void SomeMethod()
{
AggregateRoot1 root1 = AggregateRoot1Repository.GetById("someIdentification");
root1.EntityMember1.AggregateRoot2 = new AggregateRoot2();
AggregateRoot1Repository.Update(root1);
}
public class AggregateRoot1Repository
{
public static void Update(AggregateRoot1 root1)
{
//Implement some mechanism to detect changes to referenced roots
AggregateRoot2Repository.HandleReference(root1.EntityMember1, root1.EntityMember1.AggregateRoot2)
}
}
这只是一个简单的例子,不包括得墨忒耳法则或其他最佳原则/实践:-)
进一步的评论表示赞赏。