【问题标题】:Which level of communication is allowed between Aggregates Roots in DDD?DDD 中的聚合根之间允许哪种级别的通信?
【发布时间】: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


    【解决方案1】:

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

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

    因此,如果您的模型包含 Product 和 BacklogItem 之间的关系,那么您可以使用 BacklogItem 中数据的陈旧副本修改 Product,或者您可以使用 Product 中数据的陈旧副本修改 BackLogItem。

    为了帮助在代码中明确这一点,我们使用接口将消息从一个聚合传递到另一个聚合。在我们要修改产品的用例中,我们有一个支持突变的产品接口和一个只支持查询的积压日志项接口。如果我们要更新 back log item,那么 item 有 mutable 接口,product 接口是只读的。

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

    我们的回答意味着上面的代码不违反 DDD,因为我在这里不更新产品聚合(因为 ddd 每笔交易不允许更新多个聚合

    是的 - 当Evans described DDD in 2003 时,他的编码风格不依赖于接口;拥有一个产品实例,意味着该产品的所有功能一次可用。

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

    【讨论】:

    • 感谢您的回复,对不起,但是您的回答意味着上面的代码不违反 DDD,因为我这里没有更新产品聚合(因为 ddd 不允许每次更新多个聚合交易)
    猜你喜欢
    • 2011-06-20
    • 2016-03-29
    • 1970-01-01
    • 2011-03-07
    • 1970-01-01
    • 2020-01-30
    • 2020-01-22
    • 1970-01-01
    • 2016-03-21
    相关资源
    最近更新 更多