我应该从应用程序服务或实体获得其他Aggregate值吗?

时间:2017-08-31 10:48:56

标签: java domain-driven-design

我有库存,目录和销售有限的上下文。

我有这个不变量:

  

创建目录时,我们销售的产品不能超过库存中的产品

class CatalogApplicationService {
    void createCatalog(ProductId productId, int numToSell) {
        ProductValue pv = productService.byId(productId)
        // Catalog constructor will validate numToSell againts pv.numAvailable
        Catalog c = new Catalog(pv, numToSell)
        catalogRepository.save(c)
    }
}

class Catalog {
    Catalog(ProductValue pv, int numberToSell) {
        if (pv.numAvailable < numberToSell) throw new IllegalArgumentException();
        setSku(pv.sku);
        setAmount(numberToSell);
    }
}

或者我应该将服务传递到目录

class CatalogApplicationService {
    void createCatalog(ProductId productId, int numToSell) {
        Catalog c = new Catalog(productService, numToSell)
        catalogRepository.save(c)
    }
}

class Catalog {
    Catalog(ProductService productService, int numberToSell) {
        ProductValue pv = productService.byId(productId)
        if (pv.numAvailable < numberToSell) throw new IllegalArgumentException();
        setSku(pv.sku);
        setAmount(numberToSell);
    }
}

2 个答案:

答案 0 :(得分:1)

您不应在聚合(Catalog)中注入服务,而是将数据传递给它们,以使它们尽可能保持干净,而不会产生不必要的依赖。

此外,您应该在整个代码中使用无处不在的语言(UL)。例如,抛出通用IllegalArgumentException似乎并非来自您的UL。

答案 1 :(得分:0)

验证业务逻辑通常在 Service 层完成。模型应保持仅包含数据,而不是逻辑。因此,建议您使用第一个解决方案。