创建与另一个聚合有关系的聚合时的 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.
注意:在做出此回答时没有任何聚合体受到伤害或坚持。
当创建与另一个聚合有关系的新聚合时,我应该在哪里检查关系聚合是否存在?它应该在应用程序服务中,还是在某些域服务的工厂内部?
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.
注意:在做出此回答时没有任何聚合体受到伤害或坚持。