如何在 NestJS 上为 MongoDB 实现存储库设计模式

Ada*_*ams 6 design-patterns mongoose node.js nestjs

我正在尝试弄清楚如何在使用 MongoDB 和 mongoose 数据库的 NestJS 上实现存储库设计模式

Žel*_*vić 14

存储库可以注入到服务中,并且应该包含在模块内的提供者数组中。

// user.service.ts
@Injectable()
export class UserService {
  constructor(private readonly userRepository: UserRepository) {}

  async findAll(): Promise<User[]> {
    return this.userRepository.findAll();
  }
}
Run Code Online (Sandbox Code Playgroud)
// user.repository.ts
@Injectable()
export class UserRepository {
  constructor(@InjectModel(User.name) private userModel: Model<UserDocument>) {}

  async findAll(): Promise<User[]> {
    return this.userModel.find().exec();
  }
}
Run Code Online (Sandbox Code Playgroud)
// user.module.ts
@Module({
  imports: [
    MongooseModule.forFeature([{ name: User.name, schema: UserSchema }]),
  ],
  providers: [UserRepository, UserService],
  exports: [UserService],
})
export class UserModule {}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个非常简单的例子,有些方法可能包含一些复杂的逻辑。最好有一个单独的数据访问层。如果需要更改数据库,只需实现具有现有接口的新存储库并将其注入到服务中,服务方法将保持不变。 (6认同)
  • 在服务中使用存储库有什么好处,看起来我们做了两次同样的事情,我们只需在服务中注入模型就可以做同样的事情 (3认同)