在创建与其他聚合有关系的新聚合时,我应该在哪里检查关系聚合是否存在?它应该在应用程序服务中,还是在某些域服务的工厂内部?
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;
}
}
答案 0 :(得分:2)
TL; DR:转到域名。工厂与否是另一个讨论。
现在,您是否意识到,如果NewArFactory
正在控制域中的更改,NewArFactory
是一个聚合?
请记住,聚合的目的是控制变化。它可以是一个可能的实现细节,但并不总是需要持久化聚合本身。从持久性中检索聚合时,并不总是意味着您应该有一个聚合表(或在多个表中拆分)。存储库可以使用持久性中的信息获取构建聚合所需的数据(即实体 - VOs ID),并将其返回。聚合(通过聚合根)控制实体的变化,然后保持新状态。
域内的事物,比如现实生活中的事物,并不是从空气中出现的。试着了解发生了什么。汽车组装,产品从中国到达我们的商品,用户在我们的网络应用程序中注册等等。然后为您的域名表示的创建提供更好的背景(使用领域无所不在的语言涉及的用例和过程)。从那里;将出现一个聚合来控制变化。
可能是自我创建,使用其他聚合等。即使是一个未持久化的聚合也可能会创建一个持久的聚合...哎呀,如果表中没有完整的真实域上下文,这个事情会变得非常复杂。 / p>
注意:在回答这个问题时,没有任何聚合损坏也不会持续存在。