【问题标题】:should dao (or perhaps repository) take id's or entities as argumentsdao(或者可能是存储库)应该将 id 或实体作为参数
【发布时间】:2017-02-28 09:54:41
【问题描述】:

在我们的代码库中,我们广泛使用了 DAO。本质上是一个暴露低级读/写 API 的层,每个 DAO 映射到数据库中的一个表。

我的问题是,如果我们对实体有不同类型的更新,dao 的更新方法是否应该将实体 ID 或实体引用作为参数。

例如,假设我们有客户和地址。我们本来可以

customer.address = newAddress;
customerDao.updateCustomerAddress(customer);

或者我们可以有

customerDao.updateCustomerAddress(customer.getId(), newAddress);

你认为哪种方法更好?

后者更方便,因为如果我们有实体,我们总是有 id,所以它总是可以工作的。但并非总是如此,但必须先获取实体,然后再执行更新。

【问题讨论】:

    标签: java repository domain-driven-design dao


    【解决方案1】:

    在 DDD 中,我们有 AggregatesRepositoriesAggregates 确保业务不变量保持不变,Repositories 处理持久性。

    我建议Aggregates 应该是纯的,不依赖于任何基础设施代码;也就是说,Aggregates 应该对持久性一无所知。

    此外,您应该在域代码中使用Ubiquitous language。话虽如此,您的代码应该如下所示(在应用程序层中):

    customer = customerRepository.loadById(customerId); customer.changeAddress(address); customerRepository.save(customer);

    【讨论】:

      【解决方案2】:

      我猜你的问题是

      这两种方法哪个更好?

      我更喜欢第二种方法。它清楚地说明了将要做什么。更新对象将被新加载,并且绝对清楚只有地址会被更新。第一种方法留下了怀疑的余地。如果customer.name 也有新值会怎样?还会更新吗?

      【讨论】:

      • 从 DDD 的角度来看,关于如何实现存储库,这个答案是非常不正确的。然而,对于纯粹的 DAO 来说,这可能是有意义的。
      • 你是绝对正确的。我的回答只适用于我假设的问题。
      猜你喜欢
      • 2011-07-15
      • 2015-08-06
      • 2011-11-10
      • 2014-10-27
      • 2010-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多