让我向您介绍AlgoModule
:
const apiFactory = {
provide: 'API',
useFactory: (moduleRef: ModuleRef, config: ConfigService) => {
const apiService: Type<IApi> = config.getApiService();
return moduleRef.get(apiService)
},
inject: [ModuleRef, ConfigService]
}
@Module({
imports: [ConfigModule],
providers: [
// Services
ApiService,
ApiTestService,
TestService,
// Factories
apiFactory
],
exports: []
})
export class AlgoModule {}
此模块导入 ConfigModule
并有一个工厂,该工厂根据 IApi
下的环境参数创建 ApiService
实例,该实例是 ApiTestService
或 ConfigService
ConfigModule
已加载。
工厂使用注入到其上的 ConfigService
和 ModuleRef
来创建 IApi
的实例。
这是 IApi 实现之一的示例 - ApiService
:
@Injectable()
export class ApiService implements IApi {
constructor(private config: ConfigService) {
}
}
现在,当我创建一个新服务并将其放入 AlgoModule 的提供中时,假设 TestService
:
@Injectable()
export class TestService {
constructor(
private config: ConfigService,
@Inject('API') private api: IApi) {
}
}
我在这里所做的是,将令牌“API”注入 IApi,这是我在 AlgoModule
中使用 apiFactory
启动时会出现以下错误:
Error: Nest can't resolve dependencies of the ApiService(?). Please make sure that the argument dependency at index [0] is available in the AlgoModule context.
我做错了什么?
我想知道,因为我在 AlgoModule
中导入了 ConfigModule,所以工厂应该自动拥有它的依赖项。
配置服务:
@Injectable()
export class ConfigService {
serviceMapping = {
prod: ApiService,
test: ApiTestService
};
getEnv(): string | 'prod' | 'test' {
return String(process.env.ENV);
}
getApiService(): Type<IApi> {
const env = this.getEnv();
return this.serviceMapping[env];
}
}
答案 0 :(得分:-1)
您是否在全局模块的某处使用标志 isGlobal 调用了 ConfigModule.forRoot?
如果不是,那么你必须这样做,因为 ConfigModule 不像你想象的那样工作。
ConfigModule.forRoot 或 forFeature 会公开模块的 ConfigService 令牌,但普通的 ConfigModule 不会,除非它是全局的。