Ответ
В Nest.js, помимо поддержки микросервисов, активно используются и другие архитектурные паттерны.
1. Модульная архитектура. Приложение организуется в виде независимых модулей с помощью декоратора @Module(). Каждый модуль инкапсулирует контроллеры, провайдеры и импорты.
@Module({
imports: [DatabaseModule],
controllers: [UsersController],
providers: [UsersService],
})
export class UsersModule {}
2. Слоистая архитектура (Controllers → Services → Repositories). Это стандартный подход для разделения ответственности.
@Controller('users') // Слой представления/API
export class UsersController {
constructor(private usersService: UsersService) {}
}
@Injectable() // Слой бизнес-логики
export class UsersService {
constructor(private usersRepository: UsersRepository) {}
}
@Injectable() // Слой доступа к данным
export class UsersRepository {}
3. Поддержка CQRS (Command Query Responsibility Segregation). Доступна через пакет @nestjs/cqrs для разделения операций записи (команды) и чтения (запросы).
// Command Handler
@CommandHandler(CreateUserCommand)
export class CreateUserHandler implements ICommandHandler<CreateUserCommand> {
async execute(command: CreateUserCommand) {
// Логика создания пользователя
}
}
4. Event-Driven Architecture. Можно использовать встроенный EventEmitter или интегрировать брокеры сообщений (Kafka, RabbitMQ) для асинхронной коммуникации через события.
5. Принципы Domain-Driven Design (DDD). Nest.js не навязывает DDD, но его модульная система и внедрение зависимостей хорошо подходят для организации доменных моделей, агрегатов и доменных сервисов.