以前,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相关的方法(查询、聚合等)保留在存储库层中。
让我直接告诉您:我不知道这是否是一种推荐的解决方案,我不知道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"
你知道。
我将继续检查它是否没有破坏任何东西,但现在,似乎是一个很好的解决方案。
希望对你有帮助:
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,
) {}
}
希望对您有所帮助。在我的UserServices
constructor(
@InjectRepository(UserEntity)
private readonly repository: BaseRepository<UserEntity>,
) {}
UserModule
@Module({
imports: [TypeOrmModule.forFeature([UserEntity])],
exports: [UserService],
providers: [UserService],
})
export class UserModule {}
*注意:BaseRepository从typeorm-transactional-cls-hooked
这个问题在这里解决了(类似于这里的其他答案,但更完整):如何在NestJS中使用TypeORM (MongoDB)做自定义存储库?
不知道为什么他们不赞成@EntityRepository,因为这更复杂,但它工作