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

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

【问题讨论】:

    标签: javascript node.js typescript dependency-injection nestjs


    【解决方案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],
    })
    

    【讨论】:

      猜你喜欢
      • 2023-03-05
      • 2021-04-24
      • 2021-12-01
      • 2021-04-06
      • 2021-02-14
      • 2011-06-02
      • 1970-01-01
      • 2013-04-10
      • 2020-09-09
      相关资源
      最近更新 更多