如何在NestJS 9 (TypeORM 3.+)中扩展TypeORM Repository

9

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

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

@EntityRepository(User)
export class UsersRepo extends Repository<User> {
  // my custom repo methods
}

import { Injectable } from '@nestjs/common'
import { UsersRepo } from './users.repo';

@Injectable()
export class UsersService {
  constructor(private readonly usersRepo: UsersRepo) {}
}

但是自从 3.0.0 版本,TypeORM 不再支持通过继承来扩展存储库

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

4个回答

18
让我直接告诉你:我不知道这是否是一种推荐的解决方案,我不知道TypeORM的作者是否考虑过这种方法。但是我刚才做的是:
@Injectable()
export class UserRepository extends Repository<UserEntity> {


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

而且最好的部分是:它有效了 :D

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

我会继续检查是否有任何问题,但目前看来这是一个很好的解决方法。


6

希望对您有所帮助:


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 {};
  }
}

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);
  }
}

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,
  ) {}
}

1

0
希望对您有所帮助。在我的UserServices中。
constructor(
    @InjectRepository(UserEntity)
    private readonly repository: BaseRepository<UserEntity>,
) {}

用户模块

@Module({
  imports: [TypeOrmModule.forFeature([UserEntity])],
  exports: [UserService],
  providers: [UserService],
})
export class UserModule {}

*注意:BaseRepository 来自 typeorm-transactional-cls-hooked


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接