创建与其他聚合关系的聚合时的DDD一致性检查

时间:2016-10-13 09:55:22

标签: domain-driven-design factory-pattern

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

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;
   }
}

1 个答案:

答案 0 :(得分:2)

TL; DR:转到域名。工厂与否是另一个讨论。

现在,您是否意识到,如果NewArFactory正在控制域中的更改,NewArFactory是一个聚合?

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

域内的事物,比如现实生活中的事物,并不是从空气中出现的。试着了解发生了什么。汽车组装,产品从中国到达我们的商品,用户在我们的网络应用程序中注册等等。然后为您的域名表示的创建提供更好的背景(使用领域无所不在的语言涉及的用例和过程)。从那里;将出现一个聚合来控制变化。

可能是自我创建,使用其他聚合等。即使是一个未持久化的聚合也可能会创建一个持久的聚合...哎呀,如果表中没有完整的真实域上下文,这个事情会变得非常复杂。 / p>

注意:在回答这个问题时,没有任何聚合损坏也不会持续存在。