互联网上的所有示例都有基本的 4 种 crud 方法。
我真的很困惑一个大系统将如何实现存储库模式。假设我有一个属于组并且写过书的用户。
有时我只需要用户数据,有时需要他的书籍数据,有时需要组数据。我是否为每个用例实现一个方法?
如何抽象更新?如果我使用 MongoDB,那么我有 $inc
、$pull
和其他很棒的运算符。
如果我需要组合这些类型的更新,例如 $set
与 $inc
,我该如何实际抽象它们。我是否需要为系统的每个用例使用单独的方法?
最佳答案
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,它在“我们用来更改信息的设计”和“我们用来报告信息的设计”之间建立了明确的分离。
对于变化,我们当然希望将信息加载到可用于确保维持领域动态不变性的表示中。
但对于报告来说,这并不那么重要。事实上,通常的情况是(为了报告)我们只需要领域逻辑中使用的一部分信息,而不是整个信息图。在这种情况下,我们有一个不同的协议(protocol)来将查询协议(protocol)转换为有趣且有用的数据结构是有意义的。
此外,您的读取和写入可能根本不需要使用通用信息 - 最好从缓存的信息副本生成报告(例如,牺牲一些数据新鲜度以换取较低的延迟)。
REPOSITORY 的部分要点是它充当封装边界,将信息管理管道与解决方案中不关心的组件解耦。
And how to abstract updates? If I am using MongoDB then I have $inc, $pull and other awesome operators.
选择适当的抽象层。
如果 mongo 或类似 mongo 的功能是您选择持久存储的必要约束,那么能够从存储库接口(interface)检测到这一点是一件好事。
如果这些功能仅出现在少数代码路径中,那么您可能有多种可用方法 - 一组用于那些不需要从 mongo 获得额外功能的路径的方法,以及另一个为那些执行此操作的路径设置一组方法。
关于database - 如何正确实现存储库模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65439323/