创建与另一个聚合有关系的聚合时的 DDD 一致性检查

DDD consistency check when creating aggregates with relationship to another aggregates

当创建与另一个聚合有关系的新聚合时,我应该在哪里检查关系聚合是否存在?它应该在应用程序服务中,还是在某些域服务的工厂内部?

class ApplicationService
{
   public void CreateNewAr(relationArId, relationArId2)
   {
      var relationAR = _relationArRepository.getById(relationArId);
      if(relationAR == null)
        throw NotFoundException();

       var relationAR2 = _relationAr2Repository.getById(relationArId2);
       if(relationAR2 == null)
        throw NotFoundException();

      var newAr = _newArFactory.CreateFromAr1And2(relationAR.id, relationAR2.id);
      _newArRepository.Insert(newAr);
      _uow.Commit();
  }
}

class NewArFactory
{
   public NewAr CreateFromAr1And2(relationArId, relationArId2)
   {
      var relationAR = _relationArRepository.getById(relationArId);
      if(relationAR == null)
        throw NotFoundException();

       var relationAR2 = _relationAr2Repository.getById(relationArId2);
       if(relationAR2 == null)
        throw NotFoundException();

      var newAr = new NewAr(relationAR.id, relationAR2.id);
      return newAr;
   }
}

TL;DR:寻找域名。工厂与否另议。

现在,您是否意识到,如果 NewArFactory 控制域中的变化,那么 NewArFactory 是一个聚合?

请记住,聚合的目的是控制变化。它可以是一个可能的实现细节,但并不总是聚合本身需要被持久化。当您从持久性中检索聚合时,并不总是意味着您应该有一个聚合 table(或分成几个 table)。存储库可以获取构建聚合所需的数据(即实体 - VO id),使用持久性信息,并 return 它。聚合(通过聚合根)控制实体的变化,然后持久化新状态。

域中的事物,就像现实生活中一样,不会凭空出现。试着了解正在发生的事情。组装汽车、产品从中国到达我们的仓库、用户在我们的网络应用程序中注册自己等。然后为创建您的域表示(涉及使用域无处不在的语言的用例和过程)提供更好的上下文。从那里;将出现一个集合来控制变化。

可能是自我创建,使用另一个聚合,等等。即使一个未持久化的聚合也可以创建一个持久化的聚合...哎呀,如果 table.

注意:在做出此回答时没有任何聚合体受到伤害或坚持。