【发布时间】:2017-10-03 22:46:25
【问题描述】:
根据 vaughn vernon 在他关于敏捷的书中给出的示例。他将 Product 设计为一个聚合,并将 BackLogItem 设计为一个聚合,它通过 Id 引用 Product AR。
现在我们需要在 BackLogApplicationService 中规划新的 BackLogItem,如下所示:
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 计划到该产品中,如果是这样,我如何防止将新的 backLogItem 计划到该产品中,以防万一产品被暂停或处于非活动状态?
【问题讨论】:
标签: domain-driven-design aggregateroot