[英]Importing TypeScript modules with dependency injection in NestJS
在我的 NestJS 應用程序中 - 我有 TypeScript 類,其中注入了其他類和值。 唯一的問題是我使用import
語句導入 TypeScript 類,並使用 DI 系統注入它們。 有什么方法可以刪除導入語句,讓 DI 系統處理它嗎?
import
-> 類引用依賴注入系統主要處理類的實例化。 這很棒,因為您不需要關心要注入的類所需的傳遞依賴項。
示例:我想在我的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.