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

时间:2017-02-28 09:54:42

标签: java repository domain-driven-design dao

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

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

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

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

或者我们可以

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

你会说哪种方法更好?

后者更方便,因为如果我们有实体,我们总是有id,所以它总是有效。反过来并非总是如此,但在执行更新之前必须先获取实体。

2 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:-1)

我认为你的问题是

  

两者哪种方法更好?

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