advanced

NestJS dependency injection

Объясняйте provider tokens, constructor injection, module visibility, request scope, custom providers, overrides и test seams.

NestJS строит dependency graph при bootstrap: параметры constructor с type metadata резолвятся в зарегистрированные providers. Modules контролируют видимость — provider injectable только где module imported и provider exported.

					const MAILER = Symbol('MAILER');

@Module({
  providers: [
    { provide: MAILER, useClass: SmtpMailer },
    { provide: UsersService, useClass: UsersService },
  ],
  exports: [UsersService, MAILER],
})
export class UsersModule {}
				

`@Inject(TOKEN)` связывает interfaces и custom tokens. `forwardRef` разрывает circular constructor dependencies. В тестах — `TestingModule.overrideProvider`.

На интервью: Nest DI против manual singletons, правила module visibility, как request-scoped injection распространяется на зависимые providers.

Типовые ошибки: inject concrete classes вместо tokenized interfaces, circular module graphs, глобальная доступность без `exports`.

Компромисс — между простотой, производительностью, безопасностью и эксплуатацией: назовите, что оптимизировали и какую цену приняли.

Чеклист:

  • Constructor injection, не property.
  • Токены для ports/adapters и test seams.
  • Явный export providers между modules.
  • Override в тестах, не production hacks.