根据vaughn在他的关于Agile.He的书中给出的例子,他将Product设计为一个聚合,而BackLogItem设计为一个聚合,它通过Id引用Product。
现在,我们需要在BackLogApplicationService中规划新的BackLogApplicationService,如下所示:
public class ProductBacklogItemService
{
//...
public void planProductBacklogItem(
String aTenantId, String aProductId,
String aSummary, String aCategory,
String aBacklogItemType, String aStoryPoints)
{
Product product =
productRepository.productOfId(
new TenantId(aTenantId),
new ProductId(aProductId));
BacklogItem plannedBacklogItem =
BacklogItem.planBacklogItem(
aSummary,
aCategory,
BacklogItemType.valueOf(aBacklogItemType),
StoryPoints.valueOf(aStoryPoints),
product);
backlogItemRepository.add(plannedBacklogItem);
//commit the changes
}
//...
}工厂的方法将是:
public static BacklogItem planBacklogItem(String aSummary, String aCategory,BacklogItemType aType, StoryPoints aStoryPoints,Product product)
{
if(product.Suspended)
//here prevent planning this backlogitem
//...
backLogItem.ProductId=product.Id
return backLogItem;
}我是否违反了工厂方法中的BackLogItem聚合的一致性边界,因为我正在使用一些有关产品状态的信息来决定将新的backLogItem规划到该产品中,如果是这样的话,我如何能够防止在该产品被暂停或不活动的情况下规划新的backLogItems?
发布于 2017-10-03 14:26:11
在DDD中,Aggregates Root之间的通信级别是允许的吗?
核心准则是:任何给定的事务最多修改模型中的一个聚合。
因此,如果您的模型包含一个产品和一个BacklogItem之间的关系,那么您可以使用来自BacklogItem的陈旧数据副本来修改一个产品,或者可以使用来自某个产品的陈旧数据副本来修改一个BackLogItem。
为了在代码中明确这一点,我们使用接口将消息从一个聚合传递到另一个聚合。在我们要修改产品的用例中,我们有一个支持突变的产品接口和一个只支持查询的back日志项接口。如果我们要更新back日志项,则该项具有可变接口,并且只读取产品接口。
换句话说,我们使用适当的角色接口来确保没有代码作者无意中违反了修改事务中的多个聚合的规则。
我们的回答--这意味着上面的代码没有违反DDD,因为我这里没有更新产品聚合(因为ddd,每个事务不允许更新多个聚合
对--当埃文斯在2003年描述了DDD时,他使用的是一种不依赖于接口的编码风格;拥有一个产品的实例意味着可以同时拥有该产品的所有功能。
角色接口有助于减少这种灵活性所导致的错误数量。简单地说,不犯错也是一种选择。
https://stackoverflow.com/questions/46542068
复制相似问题