如何在 NestJS 9 (TypeORM 3.+) 中扩展 TypeORM 存储库

And*_*mov 9 orm dependency-injection node.js typeorm nestjs

以前,TypeORM 存储库可以扩展并直接注入到服务中,例如:

import { User } from './entities/user.entity';
import { EntityRepository, Repository } from 'typeorm';

@EntityRepository(User)
export class UsersRepo extends Repository<User> {
  // my custom repo methods
}
Run Code Online (Sandbox Code Playgroud)
import { Injectable } from '@nestjs/common'
import { UsersRepo } from './users.repo';

@Injectable()
export class UsersService {
  constructor(private readonly usersRepo: UsersRepo) {}
}
Run Code Online (Sandbox Code Playgroud)

但从 3.0.0 版本开始,TypeORM不支持通过继承扩展存储库

如何在 NestJS 9(依赖于 TypeORM 3.+)中实现这样的行为?我想到的唯一解决方案是将自定义方法添加到服务层。但我想将所有与 ORM 相关的方法(查询、聚合等)保留在存储库层中。

JFC*_*one 18

让我直接告诉你:我不知道这是否是一个推荐的解决方案,我不知道 TypeORM 的作者是否真的考虑过这种方法。但我一分钟前刚刚做的是这样的:

@Injectable()
export class UserRepository extends Repository<UserEntity> {


  constructor(
    @InjectRepository(UserEntity)
      repository: Repository<UserEntity>
  ) {
    super(repository.target, repository.manager, repository.queryRunner);
  }
}
Run Code Online (Sandbox Code Playgroud)

最好的部分:它有效:D

我用: "@nestjs/typeorm": "^9.0.0"只是让你知道。

我会继续检查它是否不会破坏任何东西,但就目前而言,这似乎是一个很好的解决方法。


Dan*_*ilo 7

希望对您有帮助:


import { DataSource, Repository } from 'typeorm';
import { EntityTarget } from 'typeorm/common/EntityTarget';

export class GenericRepository<T> extends Repository<T> {
  constructor(target: EntityTarget<T>, dataSource: DataSource) {
    super(target, dataSource.createEntityManager());
  }

  async someCommonMethod() {
    return {};
  }
}
Run Code Online (Sandbox Code Playgroud)
import { DataSource } from 'typeorm';
import { User } from '../../entities/User';
import { Injectable } from '@nestjs/common';
import { GenericRepository } from '../common/generic.repository';

@Injectable()
export class UserRepository extends GenericRepository<User> {
  constructor(dataSource: DataSource) {
    super(User, dataSource);
  }
}
Run Code Online (Sandbox Code Playgroud)
import { Injectable } from '@nestjs/common';
import { User } from '../../entities/User';
import { InjectRepository } from '@nestjs/typeorm';
import { UsersRepository } from './users.repository';


@Injectable()
export class UsersService {
  constructor(
    @InjectRepository(User)
    private readonly usersRepository: UsersRepository,
  ) {}
}
Run Code Online (Sandbox Code Playgroud)