如何正确实现存储库模式?

How to correctly implement the repository pattern?

网上所有的例子都有4种基本的crud方法。

我真的很困惑一个大系统将如何实现存储库模式。假设我有一个属于群组的用户并且写过书。

有时我只需要用户数据,有时需要他的书籍数据,有时需要群组数据。我是否为每个用例实施一个方法?

以及如何抽象更新?如果我使用 MongoDB,那么我有 $inc$pull 和其他很棒的运算符。

如果我需要将这些类型的更新组合起来,例如 $set$inc,我该如何抽象它们呢?我需要为系统的每个用例使用单独的方法吗?

就我而言,我为一种聚合和一种存储方法创建了一个存储库。 在 store 方法中,我更新了持久数据和修改对象之间的差异。当没有持久数据时,我会插入。 聚合的存储库还将管理与聚合具有父子关系的子元素的 CRUD。详细实现可以分开类.

Sometimes I only need the user data, some times with his books data and sometimes with groups data. Do I implement a method for each of the usecases ?

当然有可能。

值得考虑的有趣方法之一是 CQRS,它明确区分了“我们用来更改信息的设计”和“我们用来报告信息的设计”。

对于更改,我们当然希望将信息加载到可用于确保保持域动态不变性的表示中。

不过,对于报告而言,这并不是那么重要。事实上,通常情况下(为了报告)我们只需要领域逻辑中使用的一部分信息,而不是 整个 信息图。在这种情况下,我们可以使用不同的协议将查询协议转换为有趣且有用的数据结构。

此外,您的读取和写入可能根本不需要使用公共信息 - 从缓存的信息副本生成报告可能更好(例如,牺牲一些数据新鲜度来换取较低的延迟) ).

REPOSITORY 的部分要点在于它充当封装边界,将信息管理管道与解决方案中不关心的组件分离。


And how to abstract updates? If I am using MongoDB then I have $inc, $pull and other awesome operators.

选择合适的抽象层。

如果 mongo 或 mongo 之类的功能是您选择持久存储的必要约束,那么能够从存储库界面检测到这一点是一件好事。

如果这些功能只出现在几个代码路径中,那么您可能会有多种方法可用 - 一组方法用于那些不需要您从 mongo,以及用于那些路径的另一组方法。