gpt4 book ai didi

domain-driven-design - 聚合根引用其他聚合根

转载 作者:行者123 更新时间:2023-12-03 01:11:51 25 4
gpt4 key购买 nike

我目前经常使用 DDD,并且在从其他聚合根加载/操作聚合根时遇到问题。

对于模型中的每个聚合根,我还有一个存储库。存储库负责处理根的持久性操作。

假设我有两个聚合根,以及一些成员(实体和值对象)。

AggregateRoot1 和 AggregateRoot2。

AggregateRoot1 有一个引用 AggregateRoot2 的实体成员。

  1. 加载 AggregateRoot1 时,是否也应该加载 AggregateRoot2?
  2. AggregateRoot2 的存储库应该对此负责吗?
  3. 如果是,AggregateRoot1中的实体可以调用AggregateRoot2的存储库进行加载吗?

此外,当我在 AggregateRoot1 中的实体与 AggregateRoot2 之间创建关联时,应该通过实体还是通过 AggregateRoot2 的存储库来完成?

希望我的问题有意义。

[编辑]

当前解决方案

Twith2Sugars 的帮助下我想出了以下解决方案:

如问题中所述,聚合根可以具有引用其他根的子项。将 root2 分配给 root1 的成员之一时,root1 的存储库将负责检测此更改,并将其委托(delegate)给 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);
}
}

编辑:

真的推荐有关该主题的这些文章:https://vaughnvernon.co/?p=838

关于domain-driven-design - 聚合根引用其他聚合根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4919687/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com