在 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 中使用 UserServiceUserService 需要 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],
})