如何正确实现存储库模式?
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,以及用于那些路径的另一组方法。
网上所有的例子都有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,以及用于那些路径的另一组方法。