存储库模式实际用例和在 Node.js 中的实现

kha*_*vid 2 javascript design-patterns repository-pattern node.js

有人可以举例解释一下这个模式的用途吗?

\n

我感到困惑的是,我可以在任何我想要的地方拥有数据库实例,并且我可以灵活地通过它做任何事情,我错了吗?特别是

\n

Rob*_*bot 22

\xc2\xa0 存储库模式\xc2\xa0 是一种抽象数据访问的策略。

\n

它\xe2\x80\x99就像在应用程序和数据之间放置一个通用适配器,因此\xe2\x80\x99与你使用什么数据存储技术无关。您的应用程序想要的只是\xc2\xa0在\xc2\xa0项上定义操作,它不应该\xe2\x80\x99不必关心它\xe2\x80\x99如何存储或它来自哪里。

\n

此外,无需提及更改的所有影响都将从一个位置处理,而不是通过代码级联!

\n

就我个人而言,我喜欢这种设计模式,因为它允许我在第一步只关心我的业务逻辑,而不是处理变体数据库,最重要的是,它解决了我在编写测试时的大量头痛!因此,我可以简单地享受操作的模拟版本,而不是存根或监视数据库(这可能会令人头疼)

\n

现在让\xe2\x80\x99s用js实现一个示例,它可以像下面的代码一样简单(当然这是一个简化的示例)

\n
// userRepository.js\nconst userDb = [];\n\nmodule.exports = {\n  insert: async (user) => userDb.push(user),\n  findAll: async () => userDb,\n};\n
Run Code Online (Sandbox Code Playgroud)\n

这是我如何使用这种模式,首先我在 5 分钟内编写如下代码

\n
// userRepository.js\nconst userDb = new Map();\n\nmodule.exports = Object.freeze({\n  findById: async (id) => userDb.get(id),\n  insert: async (user) => userDb.set(user.id, user),\n  findAll: async () => Array.from(userDb.values()),\n  removeById: async (id) => userDb.delete(id),\n  update: async (updatedUser) => {\n    if (!userDb.has(updatedUser.id)) throw new Error('user not found');\n    userDb.set(updatedUser.id, { ...userDb.get(updatedUser.id), ...updatedUser });\n  },\n});\n
Run Code Online (Sandbox Code Playgroud)\n

然后我开始为我刚刚编写的存储库编写单元测试和业务用例等等\xe2\x80\xa6

\n

任何时候我\xe2\x80\x99m对一切都满意我可以简单地使用一个真正的数据库,因为它\xe2\x80\x99只是一个IO机制,不是\xe2\x80\x99吗?:)\n所以在上面的代码中我\xe2\x80\x99将用真实的数据库替换userDb并编写真实的数据访问方法,当然期望我的所有测试都能通过。

\n