![](/img/trans.png)
[英]How to inject repository providers into an entity in Nestjs (not TypeORM)
[英]How do you inject a service in NestJS into a typeorm repository?
我有一个UserRepository
,它处理在数据库UserRepository
创建/验证用户。 我想对用户的密码执行散列和验证,所以我为此创建了一个单独的服务,试图遵循单一责任原则,声明如下:
@Injectable()
export default class HashService
我将它导入到我的模块中:
@Module({
imports: [TypeOrmModule.forFeature([UserRepository])],
controllers: [AuthController],
providers: [AuthService, HashService],
})
export class AuthModule {}
我希望将它注入UserRepository
,我尝试将它作为构造函数参数传入,但它不起作用,因为它的基类已经在那里接受了 2 个参数,所以我尝试在它们之后注入我的服务,如下所示:
@EntityRepository(User)
export default class UserRepository extends Repository<User> {
constructor(
entityManager: EntityManager,
entityMetadata: EntityMetadata,
@Inject() private readonly hashService: HashService,
) {
super();
}
// Logic...
}
但是hashService
未定义,我也尝试不使用@Inject()
装饰器。 将HashService
注入我的存储库的最佳方法是什么? 我必须创建它的新实例吗?
简短的回答:你没有。
TypeORM 的自定义存储库、存储库类和实体在技术上处于 Nest 的 DI 系统之外,因此不可能向其中注入任何值。 如果你真的想要去做,你可以弄清楚Repository
类对它的构造函数参数的要求,并将它们添加到工厂以实例化存储库类并直接使用它而不是通过TypeOrmModule.forFeature
,但这有点的额外工作。
在我看来,自定义存储库模式在 Nest 中没有太大帮助,因为服务本质上保留了CustomRepository
将要使用的逻辑。 存储库类是您通往数据库的门户,但不需要向其中添加任何额外的逻辑。
您还可以从实例化存储库的主服务分配特定服务的实例。
IE
A.catalog.service.ts
@Injectable()
export class CatalogService {
constructor (
private readonly cacheService: CacheService,
public readonly catalogRepository: CatalogRepository
) {
this.catalogRepository.cacheService = this.cacheService;
}
}
B.catalog.repository.ts
@EntityRepository(CatalogEntity)
export class CatalogRepository extends Repository<CatalogEntity> {
cacheService: CacheService;
cacheExpirySeconds = 60*60;
}
您可以像这样从模块服务手动添加它:
askers.service.ts:
constructor(
@InjectRepository(AskersRepository)
private repository: AskersRepository,
private logger: LoggingService,
) {
this.repository.logger = logger;
}
askers.repository.ts:
logger: LoggingService;
然后记录器服务将在存储库中可用,就像它已被注入一样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.