Domain driven design DDD中的聚合根之间允许哪一级别的通信?

Domain driven design DDD中的聚合根之间允许哪一级别的通信?,domain-driven-design,aggregateroot,Domain Driven Design,Aggregateroot,根据沃恩·弗农(vaughn vernon)在他关于敏捷的书中给出的例子,他将产品设计为一个集合,将BackLogItem设计为一个集合,通过Id引用产品AR 现在,我们需要在BackLogApplicationService中规划新的BackLogItem,如下所示: public class ProductBacklogItemService { //... public void planProductBacklogItem( S

根据沃恩·弗农(vaughn vernon)在他关于敏捷的书中给出的例子,他将产品设计为一个集合,将BackLogItem设计为一个集合,通过Id引用产品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;
    }
我是否违反了Factory方法中BackLogItem聚合的一致性边界,因为我使用了一些关于产品状态的信息来决定计划将新的BackLogItem添加到该产品中,如果是这样,我如何防止在产品暂停或不活动的情况下将新的BackLogItem添加到该产品中

DDD中的聚合根之间允许哪一级别的通信

核心准则是:任何给定的事务最多修改模型中的一个聚合

因此,如果您的模型包含产品和后台登录项之间的关系,那么您可以使用后台登录项中的过时数据副本修改产品,也可以使用产品中的过时数据副本修改后台登录项

为了在代码中明确这一点,我们使用接口将消息从一个聚合传递到另一个聚合。在我们要修改产品的用例中,我们有一个支持突变的产品接口和一个只支持查询的后台日志项接口。如果我们要更新backlog项,那么该项具有可变接口,并且产品接口是只读的

换句话说,我们使用适当的方法来确保代码作者不会无意中违反在事务中修改多个聚合的规则

我们的回答是,这意味着上面的代码没有违反DDD,因为我在这里不更新产品聚合(因为DDD,不允许每个事务更新多个聚合)

正确-当时,他正在以一种不依赖于接口的编码方式工作;拥有一个产品实例意味着同时拥有该产品的所有功能


角色接口有助于减少这种灵活性可能导致的错误数量。不犯错误也是一种选择。

谢谢回复,抱歉,但您的回答意味着上面的代码不违反DDD,因为我不在这里更新产品聚合(由于ddd,每个事务不允许更新多个聚合)