Manual provider instantiation in NestJS allows retrieving or creating provider instances outside the standard Dependency Injection system, typically for dynamic scenarios or bootstrapping.

Use cases

  • Retrieving existing instances dynamically at runtime
  • Instantiating providers conditionally
  • Accessing providers during application bootstrap
  • Standalone application patterns

Module reference

Use the ModuleRef API to retrieve providers dynamically:

import { ModuleRef } from '@nestjs/core';
 
@Injectable()
export class CatsService {
  constructor(private moduleRef: ModuleRef) {}
 
  async getDynamicService() {
    // Retrieve a provider dynamically
    const dynamicService = await this.moduleRef.get(DynamicService);
    return dynamicService.doSomething();
  }
}

Standalone applications

For accessing providers in bootstrap() (e.g., using a ConfigService during bootstrapping):

const app = await NestFactory.create(AppModule);
const configService = app.get(ConfigService);
const port = configService.get('PORT');
await app.listen(port);

When to use

Standard DI is preferred. Use manual instantiation only when:

  • Dynamic provider resolution is needed
  • Bootstrapping requires configuration before module initialization
  • Legacy code integration requires non-standard patterns