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