在我们的代码库中,我们广泛使用DAO。本质上是一个暴露低级读/写api的层,每个DAO映射到数据库中的表。
我的问题是,如果我们在实体上有不同类型的更新,dao的更新方法应该将实体id或实体引用作为参数。
例如,假设我们有客户和adressess。我们可以
customer.address = newAddress;
customerDao.updateCustomerAddress(customer);
或者我们可以
customerDao.updateCustomerAddress(customer.getId(), newAddress);
你会说哪种方法更好?
后者更方便,因为如果我们有实体,我们总是有id,所以它总是有效。反过来并非总是如此,但在执行更新之前必须先获取实体。
答案 0 :(得分:2)
在DDD中,我们有Aggregates
和Repositories
。 Aggregates
确保业务不变量成立且Repositories
处理持久性。
我建议Aggregates
应该是纯粹的,不依赖于任何基础设施代码;也就是说,Aggregates
不应该对持久性有任何了解。
此外,您应该在域代码中使用Ubiquitous language
。话虽这么说,你的代码应该是这样的(在应用程序层中):
customer = customerRepository.loadById(customerId);
customer.changeAddress(address);
customerRepository.save(customer);
答案 1 :(得分:-1)
我认为你的问题是
两者哪种方法更好?
我更喜欢第二种方法。它清楚地说明将要做什么。更新对象将被新加载,并且绝对清楚仅地址将被更新。第一种方法留下了怀疑的余地。如果customer.name
有新值,会发生什么?它还会更新吗?