簡體   English   中英

在 NestJS 中使用依賴注入導入 TypeScript 模塊

[英]Importing TypeScript modules with dependency injection in NestJS

在我的 NestJS 應用程序中 - 我有 TypeScript 類,其中注入了其他類和值。 唯一的問題是我使用import語句導入 TypeScript 類,並使用 DI 系統注入它們。 有什么方法可以刪除導入語句,讓 DI 系統處理它嗎?

TL; 博士

  • import -> 類引用
  • DI -> 類實例化
  • 可以通過字符串標記匹配,但首選類引用。

封裝

依賴注入系統主要處理類的實例化。 這很棒,因為您不需要關心要注入的類所需的傳遞依賴項。

示例:我想在我的UserController使用UserService UserService需要UserModel進行實例化。 然而,這個二級依賴隱藏在UserController 這很好,因為當UserService獲得像LoggingService這樣的新依賴項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 )或在MockUserServiceImpl的默認情況下直接由要實例化的類。

盡管在 nestjs 中可以按名稱匹配,但首選按類匹配,因為它使重構更容易。

創建自定義提供程序時,您可以選擇要用於匹配的令牌類型。 這是需要的,當你想注入一個值(沒有匹配的類)

const connectionProvider = {
  provide: 'Connection',
  useValue: connection,
};

@Module({
  providers: [connectionProvider],
})

或動態實例化的類。

const configServiceProvider = {
  provide: ConfigService,
  useClass: process.env.NODE_ENV === 'development'
    ? DevelopmentConfigService
    : ProductionConfigService,
};

@Module({
  providers: [configServiceProvider],
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM