Camada de Aplicação
A camada de aplicação é responsável por orquestrar o fluxo entre a camada de domínio e as interfaces externas (APIs, serviços, UI). Ela não contém as regras de negócio centrais, mas coordena chamadas ao domínio, aplica validações de contexto e gerencia exceções.
Arquitetura Modular
O projeto adota uma arquitetura modular. Cada módulo da aplicação agrupa serviços, exceções e modelos relacionados a um mesmo subdomínio. Essa abordagem favorece:
- Isolamento → cada módulo é autônomo dentro de seu escopo.
- Escalabilidade → novos módulos podem ser adicionados sem impacto direto nos existentes.
- Organização → responsabilidades mais claras e manutenibilidade facilitada.
Estrutura de Pastas
- Abstractions → Interfaces e contratos usados para desacoplar dependências internas.
- Exceptions → Definições de exceções específicas da aplicação, separadas por módulos ou em pastas de uso compartilhado.
- Helpers → Classes utilitárias de apoio ao fluxo da aplicação.
- Models → Estruturas de dados para transporte de informações (DTOs, ViewModels) e validações auxiliares.
- Modules → Cada módulo encapsula os serviços necessários para lidar com um subdomínio específico.
Exemplo de Serviço
/Modules/Pedidos/Services/PedidoService.cs
public class PedidoService
{
private readonly IPedidoRepository _repository; // Inversão de dependência
public GenericService(IPedidoRepository repository)
{
_repository = repository;
}
public async Task<Guid> ExecutarAsync(Entidade entidade)
{
if (!entidade.Valida())
throw new DominioInvalidoException("Entidade inválida para operação.");
await _repository.SalvarAsync(entidade);
return entidade.Id;
}
}
Neste exemplo:
- O service orquestra o fluxo da operação.
- As regras de negócio ficam encapsuladas no domínio (
Entidade). - A camada de aplicação apenas garante validações de contexto e persistência via abstrações.
note
O repositório é implementado na camada de infraestrutura e fornecido via injeção de dependência:
Program.cs
// IReporitory é definido na Domain, Repository é concretizado na Infra
services.AddScoped<IRepository, Repository>();
warning
A camada de aplicação deve permanecer simples e desacoplada, servindo como ponte entre o domínio e os pontos de entrada do sistema.