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

标签 domain-driven-design repository aggregate loading aggregateroot

我目前经常使用 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/

相关文章:

domain-driven-design - DDD : can a Repository return entities inside an aggregate?

c# - 领域驱动设计——产品盘点,我该怎么做?

Git用户权限

c# - 聚合数据集

c# - 应用服务属于领域层还是应用层?

web-services - 从 CQRS 访问 Web 服务

ant - 无法让 Apache Ivy 不从 Spring 存储库下载源代码

node.js - npm install 忽略自己的 ssh+git 存储库

r - 如何在保持日期间隔和其他值的同时聚合 5 分钟到 30 分钟的数据

java - Spark 中聚合键、值对