Constructor-based injection is the standard and recommended dependency injection pattern in NestJS, where dependencies are declared and injected through the class constructor.

Usage

@Injectable()
export class CatsService {
  constructor(
    private readonly catsRepository: CatsRepository,
    private readonly logger: Logger,
  ) {}
}

Advantages

  • Clear visibility: All dependencies are explicitly declared in one place
  • Immutability: Dependencies can be marked as readonly
  • Type safety: Full TypeScript support
  • Testability: Easy to mock dependencies in tests

Best practices

// ✅ Recommended: Constructor injection
@Injectable()
export class CatsService {
  constructor(private readonly repo: CatsRepository) {}
}
 
// ❌ Avoid: Property injection (unless necessary)
@Injectable()
export class CatsService {
  @Inject() private readonly repo: CatsRepository;
}

Use Property-based Injection only in specific cases like inheritance chains where passing dependencies through super() becomes cumbersome.