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 中我们有 Aggregates
和 Repositories
。 Aggregates
确保业务不变量成立并 Repositories
处理持久性。
我建议Aggregates
应该是纯粹的,不依赖于任何基础设施代码;也就是说,Aggregates
应该对持久性一无所知。
此外,您应该在域代码中使用 Ubiquitous language
。话虽这么说,你的代码应该是这样的(在应用层):
customer = customerRepository.loadById(customerId);
customer.changeAddress(address);
customerRepository.save(customer);
在我们的代码库中,我们广泛使用了 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 中我们有 Aggregates
和 Repositories
。 Aggregates
确保业务不变量成立并 Repositories
处理持久性。
我建议Aggregates
应该是纯粹的,不依赖于任何基础设施代码;也就是说,Aggregates
应该对持久性一无所知。
此外,您应该在域代码中使用 Ubiquitous language
。话虽这么说,你的代码应该是这样的(在应用层):
customer = customerRepository.loadById(customerId);
customer.changeAddress(address);
customerRepository.save(customer);