Arquitetura Backend
Injeção de dependências
Módulos NestJS, DatabaseModule e wiring de gateways
O NestJS concentra o wiring em módulos globais em vez de módulos por feature.
DatabaseModule — padrão central
Arquivo: src/infra/database/database.module.ts
Registra ~52 bindings no formato:
{
provide: QueueRepositoryGateway,
useClass: KnexQueueRepository,
}Também registra providers de conexão:
CompanyKnexProvider— banco por empresaAdminKnexProvider— catálogo adminAdminDynamicKnexProvider— conexões dinâmicas admin
Exports: todas as classes abstratas de gateway, para que módulos importadores possam injetá-las.
Módulos transversais
| Módulo | Gateway | Implementação |
|---|---|---|
BrokerModule | BrokerGateway | RabbitMQBroker |
EncryptModule | EncryptGateway | JwtEncrypt |
EmailModule | EmailGateway | Nodemailer |
RedisModule | RedisGateway | Redis client |
S3Module | — (sem gateway) | AWSS3Service |
ReportsModule | — | Consumers + helpers |
HTTPModule
@Module({
imports: [EncryptModule, DatabaseModule, S3Module, BrokerModule, RedisModule, EmailModule, ReportsModule],
controllers: [...CONTROLLERS],
providers: [
...SERVICES, // src/external/* — microserviços
...USECASES, // src/app/use-cases/*
{ provide: APP_GUARD, useClass: GCIPermissionGuard },
{ provide: APP_GUARD, useClass: CustomerGuard },
],
})Diagrama de injeção
Regras de DI
- Gateways: sempre
provide: AbstractClass, useClass: ConcreteClass. - Use cases: registrados diretamente no array
providers(semuseClass). - Controllers: injetam use cases pelo tipo da classe.
- Use cases injetam gateways pelo tipo abstrato no constructor — o Nest resolve automaticamente se o gateway estiver em
exportsde um módulo importado.
Próximos tópicos
- Padrão Gateway
- Exceções pragmáticas — S3 e microserviços sem gateway