Bird
Raised Fist0
NestJSframework~8 mins

Dependency injection basics in NestJS - Performance & Optimization

Choose your learning style10 modes available
Performance: Dependency injection basics
MEDIUM IMPACT
Dependency injection affects application startup time and runtime memory usage by managing how services and components are created and shared.
Creating and using services in a NestJS application
NestJS
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  getUser() {
    return { id: 1, name: 'Alice' };
  }
}

import { Controller, Get } from '@nestjs/common';

@Controller('users')
export class UserController {
  constructor(private readonly userService: UserService) {}

  @Get()
  getUser() {
    return this.userService.getUser();
  }
}
NestJS injects a single shared instance of UserService, reducing memory and improving startup consistency.
📈 Performance GainSaves memory by reusing instances; faster startup by centralized object creation.
Creating and using services in a NestJS application
NestJS
import { Injectable } from '@nestjs/common';

@Injectable()
export class UserService {
  getUser() {
    return { id: 1, name: 'Alice' };
  }
}

// In a controller or another service
const userService = new UserService();
userService.getUser();
Manually creating service instances bypasses NestJS's dependency injection container, causing multiple instances and redundant memory use.
📉 Performance CostIncreases memory usage and can slow startup due to unmanaged object creation.
Performance Comparison
PatternInstance CreationMemory UsageStartup TimeVerdict
Manual service instantiationMultiple instances per useHigh due to duplicatesSlower due to unmanaged creation[X] Bad
NestJS dependency injectionSingle shared instanceLower due to reuseFaster with centralized control[OK] Good
Rendering Pipeline
Dependency injection affects the application initialization phase by controlling how and when service instances are created and wired together before the app handles requests.
→Application Startup
→Memory Allocation
⚠️ BottleneckExcessive manual instantiation causes redundant memory allocation and slower startup.
Optimization Tips
1Always let NestJS create and manage service instances via dependency injection.
2Avoid manual 'new' calls for services to prevent redundant memory use.
3Use singleton services to improve startup speed and reduce memory footprint.
Performance Quiz - 3 Questions
Test your performance knowledge
What is a main performance benefit of using NestJS dependency injection for services?
AIt reuses service instances to reduce memory usage.
BIt delays service creation until after the first request.
CIt automatically caches HTTP responses.
DIt compiles services into native code.
DevTools: Node.js Inspector (or Chrome DevTools for Node)
How to check: Profile memory usage and CPU during app startup; look for multiple instances of the same service in heap snapshots.
What to look for: High memory usage or multiple identical objects indicates poor DI usage; efficient DI shows fewer instances and faster startup.

Practice

(1/5)
1. What is the main purpose of dependency injection in NestJS?
easy
A. To automatically provide required services to classes
B. To manually create instances of services inside components
C. To write all code inside a single file
D. To avoid using classes and use only functions

Solution

  1. Step 1: Understand dependency injection concept

    Dependency injection means NestJS automatically gives the needed services to classes without manual creation.
  2. Step 2: Compare options with this concept

    Only To automatically provide required services to classes describes automatic service provision, others describe manual or unrelated actions.
  3. Final Answer:

    To automatically provide required services to classes -> Option A
  4. Quick Check:

    Dependency injection = automatic service provision [OK]
Hint: Dependency injection means NestJS gives services automatically [OK]
Common Mistakes:
  • Thinking you must create service instances manually
  • Confusing dependency injection with code organization only
  • Believing dependency injection removes classes
2. Which decorator marks a class as injectable for NestJS dependency injection?
easy
A. @Module()
B. @Controller()
C. @Injectable()
D. @Service()

Solution

  1. Step 1: Recall NestJS decorators for DI

    Classes that can be injected must be marked with @Injectable() decorator.
  2. Step 2: Check each option

    @Controller is for controllers, @Module for modules, @Service is not a NestJS decorator.
  3. Final Answer:

    @Injectable() -> Option C
  4. Quick Check:

    @Injectable() marks injectable classes [OK]
Hint: Use @Injectable() to mark services for injection [OK]
Common Mistakes:
  • Using @Controller or @Module instead of @Injectable
  • Assuming @Service is a valid NestJS decorator
  • Forgetting to add any decorator
3. Given this code snippet, what will be the output when appService.getMessage() is called?
import { Injectable } from '@nestjs/common';

@Injectable()
export class AppService {
  getMessage() {
    return 'Hello from AppService';
  }
}

export class AppController {
  constructor(private readonly appService: AppService) {}

  showMessage() {
    return this.appService.getMessage();
  }
}
medium
A. Error: AppService not provided
B. 'Hello from AppService'
C. undefined
D. 'Hello from AppController'

Solution

  1. Step 1: Understand injection in constructor

    AppController receives AppService instance via constructor injection because AppService is marked @Injectable.
  2. Step 2: Trace method call

    showMessage calls appService.getMessage(), which returns 'Hello from AppService'.
  3. Final Answer:

    'Hello from AppService' -> Option B
  4. Quick Check:

    Injected service method returns message [OK]
Hint: Injected service methods return their defined values [OK]
Common Mistakes:
  • Assuming injection fails without @Module setup
  • Expecting AppController message instead
  • Confusing method return values
4. Identify the error in this NestJS service injection code:
import { Injectable } from '@nestjs/common';

export class UserService {
  getUser() {
    return 'User data';
  }
}

@Injectable()
export class UserController {
  constructor(private readonly userService: UserService) {}

  fetchUser() {
    return this.userService.getUser();
  }
}
medium
A. UserService is missing @Injectable() decorator
B. UserController should not have a constructor
C. fetchUser method should be async
D. userService property should be public

Solution

  1. Step 1: Check decorators on injectable classes

    UserService is injected into UserController but lacks @Injectable(), so NestJS cannot inject it.
  2. Step 2: Verify other options

    Constructor in controller is valid, fetchUser need not be async, and private readonly is correct for injection.
  3. Final Answer:

    UserService is missing @Injectable() decorator -> Option A
  4. Quick Check:

    Injectable classes must have @Injectable() [OK]
Hint: Injectable services must have @Injectable() decorator [OK]
Common Mistakes:
  • Forgetting @Injectable on services
  • Thinking constructor is invalid in controllers
  • Assuming async is required for injected methods
5. You want to inject two different services, LoggerService and ConfigService, into a controller. Which is the correct way to do this in NestJS?
hard
A. Inject only one service and import the other directly
B. Create instances manually inside the controller constructor
C. Use @Injectable() on the controller and call services statically
D. Use constructor injection with both services as parameters marked private readonly

Solution

  1. Step 1: Recall how to inject multiple services

    In NestJS, multiple services are injected by listing them as constructor parameters with access modifiers like private readonly.
  2. Step 2: Evaluate options

    Use constructor injection with both services as parameters marked private readonly correctly uses constructor injection. Create instances manually inside the controller constructor manually creates instances, breaking DI. Use @Injectable() on the controller and call services statically misuses @Injectable on controller and static calls. Inject only one service and import the other directly injects only one service, which is incomplete.
  3. Final Answer:

    Use constructor injection with both services as parameters marked private readonly -> Option D
  4. Quick Check:

    Multiple services injected via constructor parameters [OK]
Hint: Inject multiple services by listing them in constructor [OK]
Common Mistakes:
  • Manually creating service instances inside controllers
  • Using static calls instead of injection
  • Injecting only one service when multiple are needed
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard