Saltar al contenido principal

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.
nota

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>();
aviso

A camada de aplicação deve permanecer simples e desacoplada, servindo como ponte entre o domínio e os pontos de entrada do sistema.