如何在DDD中引用两个AggregateRoot

时间:2018-02-26 21:27:05

标签: domain-driven-design aggregateroot

我有两个域对象,ParentChildParent可以有零个或多个孩子,Child可以属于零个或多个父母(如果父母离婚)。

因此,在域驱动设计的上下文中考虑这一点我会说ParentChild都是AggregateRoot。因为这是一种多对多的关系。

现在我想知道我应该如何在代码中对此进行建模。我需要能够访问Child班级的家长,以及Parent班级的所有孩子。

所以我想这样做:

public class Parent : AggregateRoot
{
    public string FamilyName {get;set;}
    public IList<Guid> ChildrenIds {get;set;}
}

public class Child : AggregateRoot
{
    public string Name {get;set;}
    public IList<Guid> ParentIds {get;set;}
}

让这两个课程通过他们的id相互引用是否可以?

或者是否有更好的方法对此进行建模?

背景信息

父母及其子女可以在我们的申请中注册。然后,我们的系统会记录该孩子经历的事件。游泳,去博物馆等。

例如;

  • 妈妈和她唯一的孩子在我们的申请中注册。
  • 同时将事件记录到子实体。参观博物馆,游泳等。
  • 两个月后,爸爸也需要在我们的系统中注册(coparenting)。妈妈和Das显然应该引用同一个子实体。

我需要能够使用以下用例:

  • 在一年中的所有几周,妈妈都对孩子负责。
  • 在所有不平衡的一周,爸爸负责。
  • 如果在偶数周发生了什么事(妈妈),那么这个活动就会被注册。
  • 如果申请稍后检索爸爸聚合,那么他不仅应该获得与妈妈相同的孩子的参考,还应该看到前一周发生的所有事件。
因此,父母可以有很多孩子,孩子可以有很多父母。我的问题是我不确定如何在DDD中对此进行建模。

1 个答案:

答案 0 :(得分:0)

当我有两个相互引用的模型时,我强迫自己寻找一个缺失的部分。

听起来您的企业并不关心谁是孩子的父母,它关心的是谁在某个特定时间点对孩子负责。所以它可能看起来像你缺少第三个域模型:Guardian(我确定它们是一个更好的名称),这消除了父和子实体明确引用彼此的需要。

class Guardian {
    GuardianId Id {get;private set;}
    ParentId ParentId {get;private set;}
    ChildId ChildId {get;private set;}
    List<DateRule> WhenResponsible {get;private set;}

    bool IsResponsibleForChildAt(date day) {
      return WhenResponisble.Any(dr=>dr.AppliesToDate(day));
    }
}

现在,根据您的业务,Guardian模型可能更自然地适合Child或Parent模型,您的域专家应该能够在这里提供帮助。