在 NestJS 中使用依赖注入导入 TypeScript 模块
Importing TypeScript modules with dependency injection in NestJS
在我的 NestJS 应用程序中 - 我有 TypeScript 类,其中注入了其他 类 和值。唯一的问题是我正在导入带有 import
语句的 TypeScript 类,并且还使用 DI 系统注入它们。有什么方法可以删除导入语句,让 DI 系统处理它吗?
TL;DR
import
-> class参考
- DI -> class 实例化
- 可以通过字符串标记进行匹配,但首选 class 引用。
封装
依赖注入系统主要处理classes的实例化。这很好,因为您不需要关心要注入的 class 所需的传递依赖项。
示例:我想在 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) {}
}
Class参考
但是为了让 DI 知道要注入哪个服务,您需要从 @Inject
声明到实际 class 的一些 link 来实例化。当然,这个机制依赖于DI系统的实现。引用可以按名称(字符串匹配)、按接口(DI 决定使用哪个实现:UserService
-> UserServiceImpl
/ MockUserServiceImpl
)或在 nestjs 的默认情况下直接由class 待实例化。
虽然在 nestjs 中可以按名称匹配,但首选 class 匹配,因为它使重构更容易。
创建 custom provider 时,您可以选择要用于匹配的令牌类型。这是需要的,当你想注入一个值时(没有 class 用于匹配)
const connectionProvider = {
provide: 'Connection',
useValue: connection,
};
@Module({
providers: [connectionProvider],
})
或动态实例化class。
const configServiceProvider = {
provide: ConfigService,
useClass: process.env.NODE_ENV === 'development'
? DevelopmentConfigService
: ProductionConfigService,
};
@Module({
providers: [configServiceProvider],
})
在我的 NestJS 应用程序中 - 我有 TypeScript 类,其中注入了其他 类 和值。唯一的问题是我正在导入带有 import
语句的 TypeScript 类,并且还使用 DI 系统注入它们。有什么方法可以删除导入语句,让 DI 系统处理它吗?
TL;DR
import
-> class参考- DI -> class 实例化
- 可以通过字符串标记进行匹配,但首选 class 引用。
封装
依赖注入系统主要处理classes的实例化。这很好,因为您不需要关心要注入的 class 所需的传递依赖项。
示例:我想在 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) {}
}
Class参考
但是为了让 DI 知道要注入哪个服务,您需要从 @Inject
声明到实际 class 的一些 link 来实例化。当然,这个机制依赖于DI系统的实现。引用可以按名称(字符串匹配)、按接口(DI 决定使用哪个实现:UserService
-> UserServiceImpl
/ MockUserServiceImpl
)或在 nestjs 的默认情况下直接由class 待实例化。
虽然在 nestjs 中可以按名称匹配,但首选 class 匹配,因为它使重构更容易。
创建 custom provider 时,您可以选择要用于匹配的令牌类型。这是需要的,当你想注入一个值时(没有 class 用于匹配)
const connectionProvider = {
provide: 'Connection',
useValue: connection,
};
@Module({
providers: [connectionProvider],
})
或动态实例化class。
const configServiceProvider = {
provide: ConfigService,
useClass: process.env.NODE_ENV === 'development'
? DevelopmentConfigService
: ProductionConfigService,
};
@Module({
providers: [configServiceProvider],
})