---
title: Use NestJS Dependency Injection
impact: HIGH
impactDescription: Enables testability, loose coupling, and maintainability
tags: patterns, dependency-injection, nestjs, testing
---
## Паспорт документа

- Статус документа: living standard
- Актуально на: 28 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при изменении инженерной практики, CI/CD, архитектурных правил или локального workflow
- Область применения: внутренние rule/reference-card документы для инженерной команды
- Связанные документы:
  - [Индекс Agents](../README.md)
  - [Команды разработки](../commands.md)
  - [Инженерные принципы](../../governance/engineering-principles.md)

## Use NestJS Dependency Injection

**Impact: HIGH**

All services, repositories, and providers are managed by NestJS DI container. Never instantiate classes manually.

**Incorrect (manual instantiation):**

```typescript
@Injectable()
export class ItemService {
  private repo = new ItemRepository(new PrismaService()); // Wrong!
  private cache = new CacheService(new RedisService());    // Wrong!
}
```

**Correct (constructor injection):**

```typescript
@Injectable()
export class ItemService {
  constructor(
    private readonly itemRepo: ItemRepository,
    private readonly cache: CacheService,
  ) {}
}

// Module registers providers
@Module({
  imports: [PrismaModule, RedisModule],
  controllers: [ItemController],
  providers: [ItemService, ItemRepository],
  exports: [ItemService],
})
export class ItemModule {}
```

### Testing Benefits

DI makes mocking trivial:

```typescript
const module = await Test.createTestingModule({
  providers: [
    ItemService,
    { provide: ItemRepository, useValue: mockRepository },
    { provide: CacheService, useValue: mockCache },
  ],
}).compile();
```

### Rules
- All classes that need dependencies use `@Injectable()` decorator
- Dependencies injected via constructor
- Module `providers` array declares what's available
- Module `exports` array declares what other modules can use
- Use interfaces for repositories when you want to swap implementations
- Never use `new` to create injected services
