在DDD中,存储库用于执行聚合的序列化和反序列化,例如,通过读写数据库.这样,聚合可以包含更纯粹的业务逻辑,并且不会与非特定于域的持久性策略相关联. 但是,我想知道为什么存储库总
但是,我想知道为什么存储库总是被描述为专门用于聚合.是否同样有动力将它用于所有实体?
(如果这只是一个事实,即所有普通实体都可以看作是零孩子的集合根,请告知我这个问题,这个问题可以埋没.)
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并直接操作指针的列表相同.
在cqrs中,您确实看到用于除聚合之外的其他事物的“存储库” – 存储库也可用于查找模型状态的缓存视图.诀窍是视图不支持修改.在Evans描述的方法中,每个实体都有一个表示其所有角色的表示.在CQRS中,实体可能在每个角色中具有不同的表示,但通常只有一个支持修改实体的角色.