我有一个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
注入我的存储库的最佳方法是什么?我必须创建它的新实例吗?
答案 0 :(得分:1)
简短的回答:您不会。
TypeORM的自定义存储库,存储库类和实体在技术上不在Nest的DI系统之外,因此无法向其中注入任何值。如果您真的想解决这个问题,可以找出Repository
类对其构造函数参数的要求,然后将它们添加到工厂中以实例化存储库类并直接使用它,而不是通过TypeOrmModule.forFeature
,但这是很多额外的工作。
我认为,自定义存储库模式在Nest中没有太大帮助,因为服务本质上具有CustomRepository
所具有的逻辑。存储库类是您访问数据库的网关,但是不需要向其添加任何额外的逻辑。