我有一个特定的用例,我需要在父类中做基于属性的提供商注入,但不知何故,提供商类没有被依赖注入捕获,因此返回为未定义。
下面是我的父类,它基本上包含一些函数来执行分页,排序等处理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
}
}
似乎是基于属性和构造函数的注入之间的一个不幸的区别,在其他任何地方都没有提到。