3

我有两种情况可以使用实体的 id 或将其作为参考传递。

1) 域服务。例子:

class ProductService {
     public void changePrice(Product product, long newPrice) {
          // significant calculations involving several Entities here...
     }
     // versus
     public void changePrice(long productId, long newPrice) {
          Product product = productRepository.get(productId);
          // significant calculations involving several Entities here...
     }
}

2) 实体。例子:

class Order {
    public void addItem(Product product, long quantity) {
        // do stuff
    }
    // versus
    public void addItem(long productId, long quantity) {
        Product product = Registry.productRepository().get(productId);
        // do stuff
    }
    // or even maybe this ugly version?
    public void addItem(ProductRepository productRepository, long productId, long quantity) {
        Product product = productRepository.get(productId);
        // do stuff
    }
}

哪种方法更好,为什么?

4

1 回答 1

2

我喜欢洋葱架构的观点,即如何从概念上思考如何保护您的域免受外部影响。

IMO,最好将存储库保留在域之外。让域外的层解析域实体,然后域内使用它们

所以,我显然更愿意看到Product直接使用的例子(参考)。存储库的实现不在域中。域不应该被 id、配置或持久性弄得杂乱无章。相反,它应该直接并尽可能清晰地关注领域问题。

于 2014-09-15T19:29:08.103 回答