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

问题描述 投票:0回答:4

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

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

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

node.js dependency-injection orm nestjs typeorm
4个回答
19
投票

让我直接告诉你:我不知道这是否是一个推荐的解决方案,我不知道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"
只是让你知道。

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


8
投票

希望对您有帮助:


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(private dataSource: DataSource) {
    super(User, dataSource.createEntityManager());
  }
}

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
投票

这在这里解决了(与这里的其他答案类似,但更完整): 如何在NestJS中使用TypeORM(MongoDB)创建自定义存储库?

不知道为什么他们弃用@EntityRepository,因为这更复杂,但它有效


0
投票

希望对您有帮助。 在我的用户服务

constructor(
    @InjectRepository(UserEntity)
    private readonly repository: BaseRepository<UserEntity>,
) {}

用户模块

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

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

© www.soinside.com 2019 - 2024. All rights reserved.