kha*_*vid 2 javascript design-patterns repository-pattern node.js
有人可以举例解释一下这个模式的用途吗?
\n我感到困惑的是,我可以在任何我想要的地方拥有数据库实例,并且我可以灵活地通过它做任何事情,我错了吗?特别是
\nRob*_*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};\nRun 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});\nRun 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| 归档时间: |
|
| 查看次数: |
9423 次 |
| 最近记录: |