如何正确实现存储库模式



互联网上的所有示例都有基本的4种crud方法。

我真的很困惑一个大系统将如何实现存储库模式。比方说,我有一个用户,他属于小组,写过书。

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

如何提取更新?如果我使用MongoDB,那么我有$inc$pull和其他很棒的操作符。

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

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

这当然是可能的。

要考虑的一种有趣的方法是CQRS;我们用来改变信息的设计";以及";我们用来报告信息的设计";。

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

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

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

REPOSTORY的部分意义在于,它充当了一个封装边界,将信息管理的管道与解决方案中不关心的组件解耦。


如何提取更新?如果我正在使用MongoDB,那么我有$inc、$pull和其他很棒的运营商。

选择适当的抽象层。

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

如果这些功能只出现在几个代码路径中,那么很可能会有多个方法可用——一组方法用于那些不需要mongo提供的额外功能的路径,另一组方法则用于那些需要的路径。

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

最新更新