【问题标题】:How do you create a base service class using Nest.js + TypeORM?如何使用 Nest.js + TypeORM 创建基础服务类?
【发布时间】:2020-05-06 18:22:03
【问题描述】:

我正在使用 Nest.js + TypeORM,但在尝试向服务类添加继承时遇到了问题。

我想要一个从 Base 服务类扩展而来的用户服务类,继承它拥有的所有方法。

这就是我所做的:

export class BaseService<T> {

  private repo;
  constructor(repo: Repository<T>){
    this.repo = repo;
  }

  async findAll(opts?): Promise<T[]> {
    return this.repo.find(opts);
  }

  ......
}

然后在我的用户服务上:

export class UserService extends BaseService<User> {
  constructor(
    @InjectRepository(User)
    private userRepository: Repository<User>,
    private readonly mailerService: MailerService,
  ) {
    super(userRepository);
  }
}

这很好用,我只需要 Service 类中的单个存储库,但一旦我需要更多,例如 productRepository,正如您所见,由于构造函数被硬编码以接受单个存储库,它会失败。

我似乎无法弄清楚实现此类目标的最优雅方式是什么。

有人知道吗?

【问题讨论】:

  • 您的意思是在您的BaseService 类中再使用一个存储库吗?
  • @kkkkkkkk 不,它可以是任意数量的存储库。在某些服务中,它可能需要 3 个 repos,而在其他服务中可能只需要 1 个。
  • 是的,但那些是你的子类,不是你的BaseService 对吗?你的BaseService 只能实现你所有子类之间的通用逻辑。对于特定于某些子类的东西,您应该将它们保留在这些子类中。

标签: nestjs typeorm


【解决方案1】:

这是一个旧线程,无论如何我遇到同样的问题,这个答案可能对其他人有所帮助......

您可以拥有一个具有通用功能和样板的抽象类,您可以在所有存储库中使用它们来维护模式等等......

export abstract class BaseService<T extends ObjectLiteral> {

  protected repo: Repository<T>;
  
  async findAll(opts?): Promise<T[]> {
    return this.repo.find(opts);
  }

  ......
}

请注意这里省略了构造函数,作为一个抽象类,你永远不应该拥有它的实例,它只是一个具有常见样板和特性的扩展,你不想在每次需要时都编写具有与 CRUD 服务等相同功能的新服务...

然后你会这样使用它:

export class UserService extends BaseService<User> {
  constructor(
    @InjectRepository(User) protected readonly repo: Repository<User>,
    private readonly mailerService: MailerService,
  ) {
    super();
  }
  ...... extended stuff
}

我不确定您是否需要注入具有相同名称和可见性的 repo,但由于它对我有用,所以我没有进一步深入了解...

这种方法对我来说不好的一面是,即使您没有其他东西可以通过服务中的构造函数注入,您也需要声明构造函数并注入基础存储库......这是一个可以避免的样板也是,但我现在无法做到这一点......

【讨论】:

    猜你喜欢
    • 2018-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2012-10-25
    • 2022-09-23
    • 2012-02-11
    • 1970-01-01
    相关资源
    最近更新 更多