为什么存储库仅用于 Domain-Driven 设计中的聚合?

Why are repositories only used for aggregates in Domain-Driven Design?

在 DDD 中,存储库用于执行聚合的序列化和 de-serialization,例如通过读取和写入数据库。这样,聚合可以包含更纯粹的业务逻辑,并且不会耦合到 non-domain-specific 持久性策略。

但是,我想知道为什么存储库总是被描述为专门用于 聚合。对所有实体使用它不是同样有动力吗?

(如果这只是所有普通实体都可以被视为零聚合根的事实children,请通知我,问题可以被埋没。)

I wonder why repositories are always described as being used for aggregates specifically. Isn't it equally motivated to use it for all entities?

因为聚合是暴露给应用层的一致性边界。

也就是说,是的,存储库负责从数据存储中获取状态快照,并从中构建构成聚合的实体和值的图表。

存储库的 API 仅公开聚合根,因为它定义了一致性边界。我们不允许应用程序到达图中的任意位置并进行更改,而是强制应用程序专门与根对象通信。有了这个约束,我们只需要查看一个地方就可以确保所有更改都满足业务不变性。

因此,无需为模型中的每种类型的实体开发存储库,因为不允许应用程序直接与模型直接交互。

换句话说,聚合中的实体是私有数据结构。我们不允许客户端代码直接操作实体,原因与我们不实现允许客户端越过 api 并直接操作指针的列表的原因相同。

中,您 看到 "repositories" 用于聚合以外的东西——存储库也可用于查找缓存视图模型的状态。诀窍是视图不支持 modification。在埃文斯描述的方法中,每个实体都有一个单一的表示来履行其所有角色。在CQRS中,实体在每个角色中可能有不同的表示,但通常只有一个角色支持修改实体。

在 DDD 中有两种实体:聚合根和嵌套实体。作为@ answered, you are not allowed to modify the nested entities from outside an Aggregate so there is no need to have a repository for them (by "repository" I'm refering to an interface for load and persist an entities state). If you would be allowed, it would break the Aggregate's encapsulation,OOP 中最重要的事情之一。封装有助于丰富的领域,有很多很多模型,其中 DDD 非常适合。