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

标签 java repository domain-driven-design dao

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

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

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

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

或者我们可以

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

您认为哪种方法更好?

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

最佳答案

在 DDD 中,我们有聚合存储库聚合确保业务不变量保持不变,而存储库处理持久性。

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

此外,您应该在域代码中使用通用语言。话虽这么说,您的代码应该如下所示(在应用程序层):

客户 = customerRepository.loadById(customerId); 客户.changeAddress(地址); customerRepository.save(客户);

关于java - dao(或者可能是存储库)应该将 id 或实体作为参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42505436/

相关文章:

programming-languages - 按编程语言列出的顶级存储库

git - 编写一个 git post-receive hook 来处理特定的分支

architecture - 数据访问层应该知道域吗?

c# - DDD : Referencing MediatR interface from the domain project

java - 用领域驱动设计实现分页和排序

Java/Android 无法解释的编译错误 : is not abstract and does not override abstract method onTabReselected(Tab, FragmentTransaction) in TabListener

java - 以不区分大小写的方式将 List<String> 转换为 Set-Java 6

java - 寻找涉及数学的平衡括号

java - 使用 Eclipse 在 Tomcat 上进行奇怪的部署

c# - 在另一个项目/命名空间中使用现有源代码