在 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
中使用UserService
。 UserService
需要 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 依赖注入