проектdocs/Agents/rules/patterns-dependency-injection.md
patterns-dependency-injection.md
Обновлён 1 апр. 2026 г., 12:41 · 0 комментариев
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 документы для инженерной команды
- Связанные документы:
Use NestJS Dependency Injection
Impact: HIGH
All services, repositories, and providers are managed by NestJS DI container. Never instantiate classes manually.
Incorrect (manual instantiation):
@Injectable()
export class ItemService {
private repo = new ItemRepository(new PrismaService()); // Wrong!
private cache = new CacheService(new RedisService()); // Wrong!
}
Correct (constructor injection):
@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:
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
providersarray declares what's available - Module
exportsarray declares what other modules can use - Use interfaces for repositories when you want to swap implementations
- Never use
newto create injected services