DI is a key paradigm of nestjs. Here's some  experience I got after nestjs experiment.

  • Provider are scoped within a module. If you want a provider available everywhere, you need to attach it to a global module using @Global.
  • If a non-global provider is imported into multiple modules, it's initialized multiple times. Global module's providers are initialized only once.
  • Providers can use injected providers of their own using @Inject.
  • Providers by default are useClass. Other options are useFactory, useValue, useExisting
  • Providers can be async if useFactory returns a promise. Then application's startup will be delayed till async tasks are finished.