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 configuracaoCamada 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-pattern | Problema |
|---|---|
| Anemic Domain | Logica espalhada em services |
| Repository generico | Abstrai demais, complica |
| Mapper em tudo | Boilerplate 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.