在 NestJS 中使用依赖注入导入 TypeScript 模块

Posted

技术标签:

【中文标题】在 NestJS 中使用依赖注入导入 TypeScript 模块【英文标题】:Importing TypeScript modules with dependency injection in NestJS 【发布时间】:2018-12-24 14:21:32 【问题描述】:

在我的 NestJS 应用程序中 - 我的 TypeScript 类中注入了其他类和值。唯一的事情是我正在使用 import 语句导入 TypeScript 类,并且还使用 DI 系统来注入它们。有什么办法可以去掉 import 语句,让 DI 系统处理?

【问题讨论】:

【参考方案1】:

TL;DR

import -> 类参考 DI -> 类实例化 可以通过字符串标记进行匹配,但首选类引用。

封装

依赖注入系统主要处理类的实例化。这很棒,因为您不需要关心要注入的类所需的传递依赖项。

示例:我想在我的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) 

类参考

但要让 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],
)

【讨论】:

以上是关于在 NestJS 中使用依赖注入导入 TypeScript 模块的主要内容,如果未能解决你的问题,请参考以下文章

使用 Prisma 2 和 NestJS 进行日志记录 - 依赖注入问题?

nestjs 单元测试 createTestingModule 依赖注入

nestjs 全局 pubsub 实例和依赖注入

NestJS:依赖注入和提供者注册

NestJS CQRS:(存储库的)依赖注入在处理程序中不起作用

Nestjs 依赖注入 - 将服务注入服务