【问题标题】:How to correctly implement the repository pattern?如何正确实现存储库模式?
【发布时间】:2020-12-24 14:01:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: database design-patterns domain-driven-design clean-architecture


    【解决方案1】:

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

    这当然是可能的。

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

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

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

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

    REPOSITORY 的部分意义在于它充当封装边界,将信息管理管道与解决方案中无关紧要的组件解耦。


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

    选择适当的抽象层。

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 你能分享一个你做过的例子吗?我的意思是为与聚合具有父子关系的子元素管理 CRUD。
      猜你喜欢
      • 1970-01-01
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-07
      • 1970-01-01
      相关资源
      最近更新 更多