在我的NestJS应用程序中- 我有TypeScript类,这些类中已经注入了其他类和值。唯一的是,我要导入带有import语句的TypeScript类,并使用DI系统注入它们。有什么方法可以删除导入语句并让DI系统处理它?
import
依赖项注入系统主要处理类的实例化。这很好,因为您不必关心要注入的类所需的可传递依赖项。
例如:我想用UserService我的UserController。在UserService需要UserModel进行实例化。但是,此二级依赖项隐藏在中UserController。这很棒,因为当UserService获得新的依赖项(例如)时LoggingService,UserController不必更改。
UserService
UserController
UserModel
LoggingService
所以代替
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中进行引用。
@Inject
UserServiceImpl
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], })