繁体   English   中英

如何将 NestJS 中的服务注入 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM