【发布时间】:2018-12-24 14:21:32
【问题描述】:
在我的 NestJS 应用程序中 - 我的 TypeScript 类中注入了其他类和值。唯一的事情是我正在使用 import 语句导入 TypeScript 类,并且还使用 DI 系统来注入它们。有什么办法可以去掉 import 语句,让 DI 系统处理?
【问题讨论】:
标签: javascript node.js typescript dependency-injection nestjs
在我的 NestJS 应用程序中 - 我的 TypeScript 类中注入了其他类和值。唯一的事情是我正在使用 import 语句导入 TypeScript 类,并且还使用 DI 系统来注入它们。有什么办法可以去掉 import 语句,让 DI 系统处理?
【问题讨论】:
标签: javascript node.js typescript dependency-injection nestjs
import -> 类参考依赖注入系统主要处理类的实例化。这很棒,因为您不需要关心要注入的类所需的传递依赖项。
示例:我想在我的UserController 中使用UserService。 UserService 需要 UserModel 进行实例化。但是,这个二级依赖隐藏在UserController 中。这很棒,因为当 UserService 获得像 LoggingService 这样的新依赖项时,不必更改 UserController。
所以不是
class UserController {
constructor() {
const userModel = new UserModel();
this.userService = new UserService(userModel);
}
}
你可以这样做
class UserController {
// the transitive dependency on UserModel is hidden
constructor(private userService: UserService) {}
}
但要让 DI 知道要注入哪个服务,您需要一些从 @Inject 声明到要实例化的实际类的链接。当然,这种机制依赖于DI系统的实现。引用可以是名称(字符串匹配),接口(DI 决定使用哪个实现:UserService -> UserServiceImpl / MockUserServiceImpl)或者在默认情况下,nestjs 直接由要实例化的类。
虽然在 Nestjs 中可以按名称进行匹配,但还是首选按类进行匹配,因为它使重构更加容易。
当您创建custom provider 时,您可以选择要用于匹配的令牌类型。这是需要的,当你想注入一个值时(没有匹配的类)
const connectionProvider = {
provide: 'Connection',
useValue: connection,
};
@Module({
providers: [connectionProvider],
})
或动态实例化的类。
const configServiceProvider = {
provide: ConfigService,
useClass: process.env.NODE_ENV === 'development'
? DevelopmentConfigService
: ProductionConfigService,
};
@Module({
providers: [configServiceProvider],
})
【讨论】: