Artigos

Arquitetura

Clean Architecture no .NET: implementacao pragmatica

Como implementar Clean Architecture sem over-engineering. Um guia pratico para projetos reais, nao academicos.

·11 min de leitura

Clean Architecture: o essencial

Muita gente complica Clean Architecture. A essencia e simples:

Dependencias apontam para dentro. Regras de negocio nao conhecem detalhes de infraestrutura.

Estrutura de projetos

src/
├── Domain/           # Entidades e regras de negocio
├── Application/      # Casos de uso e interfaces
├── Infrastructure/   # Implementacoes concretas
└── Api/              # Controllers e configuracao

Camada Domain

// Entidade rica, nao anemica
public class Pedido
{
    public Guid Id { get; private set; }
    public StatusPedido Status { get; private set; }
    private readonly List<ItemPedido> _itens = new();
    public IReadOnlyCollection<ItemPedido> Itens => _itens;

    public void AdicionarItem(Produto produto, int quantidade)
    {
        if (Status != StatusPedido.Rascunho)
            throw new DomainException("Pedido ja foi finalizado");
        
        _itens.Add(new ItemPedido(produto, quantidade));
    }

    public void Finalizar()
    {
        if (!_itens.Any())
            throw new DomainException("Pedido sem itens");
        
        Status = StatusPedido.Finalizado;
    }
}

Camada Application

// Interface definida na Application
public interface IPedidoRepository
{
    Task<Pedido?> GetByIdAsync(Guid id);
    Task AddAsync(Pedido pedido);
}

// Caso de uso
public class FinalizarPedidoHandler : IRequestHandler<FinalizarPedido, Result>
{
    private readonly IPedidoRepository _repository;
    
    public async Task<Result> Handle(FinalizarPedido request, CancellationToken ct)
    {
        var pedido = await _repository.GetByIdAsync(request.PedidoId);
        if (pedido is null)
            return Result.NotFound();
        
        pedido.Finalizar();
        return Result.Success();
    }
}

Camada Infrastructure

// Implementacao concreta - detalhes de EF Core ficam aqui
public class PedidoRepository : IPedidoRepository
{
    private readonly AppDbContext _context;
    
    public async Task<Pedido?> GetByIdAsync(Guid id)
    {
        return await _context.Pedidos
            .Include(p => p.Itens)
            .FirstOrDefaultAsync(p => p.Id == id);
    }
}

O que NAO fazer

Anti-patternProblema
Anemic DomainLogica espalhada em services
Repository genericoAbstrai demais, complica
Mapper em tudoBoilerplate sem valor

Quando usar Clean Architecture

Use quando:

  • Sistema com regras de negocio complexas
  • Expectativa de longa vida do projeto
  • Time experiente

Nao use quando:

  • CRUD simples
  • Prototipo/MVP
  • Time junior sem mentoria

Arquitetura e sobre trade-offs. Clean Architecture nao e excecao.

#Clean Architecture#.NET#Design Patterns#SOLID
T

Tiago Spana

Software Engineer & Architect

Engenheiro de software com foco em arquitetura de sistemas, cloud-native e DevOps. Construindo sistemas escalaveis em producao.

Gostou do conteudo?

Inscreva-se para receber novos artigos sobre engenharia de software.