【发布时间】:2021-09-22 05:19:29
【问题描述】:
我想我可能误解了 Nest.js 的 IoC 容器,或者可能是整个 DI。
我有一个类 JSONDatabase,我想根据一些配置值(可以是 JSON 或 SQL)来实例化自己。
我的DatabaseService 提供者:
constructor(common: CommonService, logger: LoggerService) {
// eslint-disable-next-line prettier/prettier
const databaseType: DatabaseType = common.serverConfig.dbType as DatabaseType;
if (databaseType === DatabaseType.JSON) {
this.loadDatabase<JSONDatabase>(new JSONDatabase());
} else if (databaseType === DatabaseType.SQL) {
this.loadDatabase<SQLDatabase>(new SQLDatabase());
} else {
logger.error('Unknown database type.');
}
}
我的JSONDatabase 班级:
export class JSONDatabase implements IDatabase {
dbType = DatabaseType.JSON;
constructor(logger: LoggerService, io: IOService) {
logger.log(`Doing something...`)
}
}
但是,这样做的问题是,如果我希望我的JSONDatabase 能够利用注入,即。它需要IOService 和LoggerService,我需要从DatabaseService 构造函数中添加参数,而不是通过Nest 的IoC 容器注入它们。
Expected 2 arguments, but got 0 [ts(2554)]
json.database.ts(7, 15): An argument for 'logger' was not provided.
这是正确的方法吗?我觉得手动传递这些引用是不正确的,我应该使用 Nest 的自定义提供程序,但是,我并不真正了解有关此主题的 Nest 文档。我本质上希望能够new JSONDatabase() 而不必将引用传递给构造函数,并让 Nest.js IoC 容器已经注入现有的单例(运行时依赖注入?)。
我在这里的想法可能完全偏离了基础,但我并没有太多地使用 Nest,所以我主要是凭直觉工作。任何帮助表示赞赏。
【问题讨论】:
标签: nestjs