如何在扩展类时使用基于属性的注入



我有一个特定的用例,我需要在父类中做基于属性的提供商注入,但不知何故,提供商类没有被依赖注入捕获,因此返回为未定义。

下面是我的父类,它基本上包含一些函数来执行分页,排序等处理rest查询。这不是一个模块,也许这就是原因。

这里可能有一件事是,BaseService不是一个NestJS模块,它只是一个导出这个类的独立服务文件。

import { Model } from 'mongoose';
import { UtilsProvider } from 'src/utils/utils.service';
export class BaseService<MongooseModelT extends Record<string | number, any>>
implements OnModuleInit
{
private utilsProvider: UtilsProvider; // always returned undefined 
constructor(private mongooseModel: Model<DocumentType<MongooseModelT>>) {}

async transform(){
... Some logic that uses UtilsProvider
}
}

扩展BaseService的示例服务,

@Injectable()
export class CompaniesService extends BaseService<CompanyDocument> {
constructor(
@InjectModel(Company.name) private companyModel: Model<CompanyDocument>,
) {
super(companyModel);
}
create(createCompanyDto: CreateCompanyDto) {
return this.companyModel.create(createCompanyDto);
}
}

企业模块,

import { Module } from '@nestjs/common';
import { CompaniesService } from './companies.service';
import { CompaniesController } from './companies.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { Company, CompanySchema } from './schemas/company.schema';
@Module({
imports: [
MongooseModule.forFeature([{ name: Company.name, schema: CompanySchema }]),
],
controllers: [CompaniesController],
providers: [CompaniesService],
})
export class CompaniesModule {}

UtilsProvider是从一个模块导出的,并且它在全局作用域中,

@Global()
@Module({
providers: [UtilsProvider],
exports: [UtilsProvider],
})
export class UtilsModule {}

我还尝试用一个模块包装BaseService,并在app.module.ts文件中导入它,因为也许这就是为什么它没有捕获依赖注入,但这也不起作用。

从文档,

"…你可以在属性层使用@Inject()装饰器。

将基类更改为以下内容应该可以解决此问题:

import { Inject } from '@nestjs/common';
import { Model } from 'mongoose';
import { UtilsProvider } from 'src/utils/utils.service';
export class BaseService<MongooseModelT extends Record<string | number, any>>
implements OnModuleInit
{
@Inject(UtilsProvider) // Must have @Inject
private utilsProvider: UtilsProvider; // Will now be defined
constructor(private mongooseModel: Model<DocumentType<MongooseModelT>>) {}

async transform(){
... Some logic that uses UtilsProvider
}
}

似乎是基于属性和构造函数的注入之间的一个不幸的区别,在其他任何地方都没有提到。

最新更新