dao(或者可能是存储库)应该将 id 或实体作为参数

should dao (or perhaps repository) take id's or entities as arguments

在我们的代码库中,我们广泛使用了 DAO。本质上是一个公开低级别 read/write api 并且每个 DAO 映射到数据库中的 table 的层。

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

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

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

或者我们可以

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

您认为哪种方法更好?

后者更方便,因为如果我们拥有实体,我们将始终拥有 ID,因此它将始终有效。但情况并非总是如此,但在执行更新之前必须先获取实体。

我假设你的问题是

Which approach of the two is better?

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

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

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

此外,您应该在域代码中使用 Ubiquitous language。话虽这么说,你的代码应该是这样的(在应用层):

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