TL; DR
import
->类参考- DI->类实例化
- 可以通过字符串标记进行匹配,但最好使用类引用。
封装形式
依赖项注入系统主要处理类的实例化。这很好,因为您不必关心要注入的类所需的可传递依赖项。
例如:我想用
UserService我的
UserController。在
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中可以按名称进行匹配,但是按类进行匹配是首选,因为它使重构更加容易。
创建自定义提供程序时,您可以选择要用于匹配的令牌类型。当您要注入值时(没有用于匹配的类),这是必需的
const connectionProvider = { provide: 'Connection', usevalue: connection,};@Module({ providers: [connectionProvider],})或动态实例化的类。
const configServiceProvider = { provide: ConfigService, useClass: process.env.NODE_ENV === 'development' ? DevelopmentConfigService : ProductionConfigService,};@Module({ providers: [configServiceProvider],})


