我目前正在大量使用 DDD,并且在从其他聚合根加载/操作聚合根时遇到问题。
对于模型中的每个聚合根,我还有一个存储库。存储库负责处理根的持久性操作。
假设我有两个聚合根,以及一些成员(实体和值对象)。
聚合根 1 和聚合根 2。
AggregateRoot1 有一个引用 AggregateRoot2 的实体成员。
- 当我加载 Aggregate Root1 时,是否也应该加载 Aggregate Root2?
- AggregateRoot2 的存储库应该对此负责吗?
- 如果是的话,Aggregate Root1中的实体可以调用Aggregate Root2的存储库进行加载吗?
另外,当我在 AggregateRoot1 中的实体与 AggregateRoot2 之间创建关联时,应该通过实体还是通过 AggregateRoot2 的存储库来完成?
希望我的问题有意义。
[EDIT]
当前解决方案
在来自的帮助下含糖类 https://stackoverflow.com/users/35389/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)
}
}
这只是一个简单的例子,不包括德米特定律或其他最佳原则/实践:-)
感谢进一步的评论。
我自己也遇到过这种情况,并得出结论,让子聚合以优雅的方式工作实在是太令人头痛了。相反,我会考虑您是否确实需要将第二个聚合引用为第一个聚合的子项。如果您只保留聚合 ID 的引用而不是实际聚合本身,事情会变得更加轻松。然后,如果存在涉及两个聚合的域逻辑,则可以将其提取到域服务并如下所示:
public class DomainService
{
private readonly IAggregate1Repository _aggregate1Repository;
private readonly IAggregate2Repository _aggregate2Repository;
public void DoSomething(Guid aggregateID)
{
Aggregate1 agg1 = _aggregate1Repository.Get(aggregateID);
Aggregate2 agg2 = _aggregate2Repository.Get(agg1.Aggregate2ID);
agg1.DoSomething(agg2);
}
}
EDIT:
I REALLY推荐以下有关该主题的文章:https://vaughnvernon.co/?p=838 https://vaughnvernon.co/?p=838
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)