domain-driven-design - 从 DDD 的角度来看,我可以拥有非聚合根的存储库吗?

标签 domain-driven-design ddd-repositories

在我当前的 (JPA) 项目中,我基本上有 2 个实体。 ChainOfClassesA 和 ClassA。现在 ChainOfClassesA 基本上是 ClassA (@OneToMany) 和其他几个属性的双向列表。对我来说,ChainOfClassesA 似乎是一个聚合根,因此有专用的存储库。现在,一个用例是更新 ClassA。我知道我可以为 ClassA 创建存储库,但这会违反“每个根聚合实体一个存储库”的规则,因为 ClassA 并不是真正的聚合根,尽管这暗示我它可能是,或者可能我应该“展平 ChainOfClassesA ”。

现在我的问题是我应该务实并“打破规则”并为 ClassA 创建专用存储库,还是遵循规则并用对 ClassA 中 ChainOfClassesA 的 ID 引用替换 ChainOfClassesA 中的双向列表 @OneToMany 。第一种方法很实用,只需要做一些工作,而后一种方法还需要对代码库进行一些其他更改。你怎么看?特别是为什么我不应该为非聚合根创建存储库(除非可能会使用该存储库,以便不再满足事务边界)

最佳答案

如果 ChainOfClassesA 是一个聚合 Root 并且它有 ClassA 的集合。如果您需要一个用例来更新 ClassA,您可以在 ChainOfClassesA 对象上定义一个方法。我不认为 ClassA 有任何理由引用 ChainOfClassesA,因为无论如何它只能在 ChainOfClassesA 的范围内使用。如果 EF 允许您这样做,并不一定意味着您应该这样做。如果您为每个 ClassA 定义一个存储库,则意味着它可以与其自己的生命周期完全分离。所有其他聚合最终都与它一致。如果删除 ChainOfClassesA,ClassA 是否应该继续存在?如果是,那么 ClassA 可能应该是一个单独的聚合。

关于domain-driven-design - 从 DDD 的角度来看,我可以拥有非聚合根的存储库吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54367918/

相关文章:

domain-driven-design - DDD - 第三方 API 接口(interface)应该在哪里?

c# - DDD - 跨限界上下文和数据库中不同模式的实体一致性

spring - 如何使用 Spring Crud/Jpa Repository 实现 DDD

entity-framework - 在一笔交易中创建多个聚合

.net-core - DDD 通过间接父实体 ID 访问实体

oop - 聚合根的行为是否应该依赖于其他聚合根的属性?

architecture - CQRS:查询和业务规则

java - 在 DDD 中包装对集合的访问?

architecture - 确定 DDD 架构中的存储库和聚合大小以及责任

java - 存储库可以返回 DDD 中的分页集合吗?