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

Repository pattern practical use cases and implementation in node.js

有人可以举例说明这个模式有什么用吗?

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

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

这就像在您的应用程序和数据之间放置了一个通用适配器,因此无论您使用何种数据存储技术都无关紧要。您的应用程序需要的只是对项目进行定义的操作,它不必关心它的存储方式或来源。

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

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

下面我们用js实现一个例子,可以像下面的代码一样简单(当然是简化的例子)

// userRepository.js
const userDb = [];

module.exports = {
  insert: async (user) => userDb.push(user),
  findAll: async () => userDb,
};

我是这样使用这个模式的,首先我在 5 分钟内写了类似下面的代码

// userRepository.js
const userDb = new Map();

module.exports = Object.freeze({
  findById: async (id) => userDb.get(id),
  insert: async (user) => userDb.set(user.id, user),
  findAll: async () => Array.from(userDb.values()),
  removeById: async (id) => userDb.delete(id),
  update: async (updatedUser) => {
    if (!userDb.has(updatedUser.id)) throw new Error('user not found');
    userDb.set(updatedUser.id, { ...userDb.get(updatedUser.id), ...updatedUser });
  },
});

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

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