Clean Architecture na Prática com .NET: Como Estruturar Projetos que Escalam
Clean Architecture na Prática com .NET: Como Estruturar Projetos que Escalam

Depois de mais de 35 anos desenvolvendo sistemas, posso afirmar com segurança: a maioria dos projetos que fracassa não falha por falta de tecnologia — falha por falta de arquitetura. E é exatamente aí que a Clean Architecture faz toda a diferença.

Neste artigo vou te mostrar como aplicamos Clean Architecture em projetos .NET reais aqui na MIT Desenvolvimento de Sistemas — sem academicismo, só o que funciona.


O que é Clean Architecture?

Criada por Robert C. Martin (o famoso Uncle Bob), a Clean Architecture é um modelo de organização de código que separa as responsabilidades em camadas bem definidas, garantindo que:

  • O negócio não depende de frameworks
  • O banco de dados é um detalhe de implementação
  • A aplicação é testável de forma independente
  • As mudanças em uma camada não quebram as outras

As 4 camadas na prática

1. Domain (Domínio) É o coração da aplicação. Aqui ficam as entidades de negócio, regras e interfaces — sem nenhuma dependência externa.

csharp

public class Aluno
{
    public Guid Id { get; private set; }
    public string Nome { get; private set; }
    public string Email { get; private set; }
    public bool Ativo { get; private set; }

    public Aluno(string nome, string email)
    {
        Id = Guid.NewGuid();
        Nome = nome ?? throw new ArgumentNullException(nameof(nome));
        Email = email ?? throw new ArgumentNullException(nameof(email));
        Ativo = true;
    }

    public void Desativar() => Ativo = false;
}

2. Application (Aplicação) Orquestra os casos de uso. Usa as interfaces do Domain sem saber como são implementadas.

csharp

public class CadastrarAlunoUseCase
{
    private readonly IAlunoRepository _repository;

    public CadastrarAlunoUseCase(IAlunoRepository repository)
    {
        _repository = repository;
    }

    public async Task ExecuteAsync(string nome, string email)
    {
        var aluno = new Aluno(nome, email);
        await _repository.AddAsync(aluno);
    }
}

3. Infrastructure (Infraestrutura) Implementa os detalhes: banco de dados, APIs externas, serviços de e-mail. Aqui entra o Entity Framework, SQL Server, MongoDB, etc.

csharp

public class AlunoRepository : IAlunoRepository
{
    private readonly AppDbContext _context;

    public AlunoRepository(AppDbContext context)
    {
        _context = context;
    }

    public async Task AddAsync(Aluno aluno)
    {
        await _context.Alunos.AddAsync(aluno);
        await _context.SaveChangesAsync();
    }
}

4. Presentation (Apresentação) A camada que o usuário vê — API, MVC, Blazor. Recebe as requisições e delega para a Application.

csharp

[ApiController]
[Route("api/[controller]")]
public class AlunosController : ControllerBase
{
    private readonly CadastrarAlunoUseCase _useCase;

    public AlunosController(CadastrarAlunoUseCase useCase)
    {
        _useCase = useCase;
    }

    [HttpPost]
    public async Task<IActionResult> Cadastrar([FromBody] CadastrarAlunoRequest request)
    {
        await _useCase.ExecuteAsync(request.Nome, request.Email);
        return Ok();
    }
}

A regra de ouro: a dependência sempre aponta para dentro

Domain ← Application ← Infrastructure Domain ← Application ← Presentation

O Domain nunca conhece a Infrastructure. A Infrastructure conhece o Domain. Simples assim — e poderoso.


Quando usar Clean Architecture?

Use quando:

  • O projeto vai crescer e ter manutenção por anos
  • Você tem um time de desenvolvedores
  • As regras de negócio são complexas
  • Precisa de alta testabilidade

Evite quando:

  • É um projeto pequeno e pontual
  • O prazo é curtíssimo e a equipe não conhece o padrão
  • É um CRUD simples sem regras de negócio

Erros mais comuns que vejo nos times

1. Colocar lógica de negócio na Controller A Controller deve só receber, delegar e responder. Nunca processar regras.

2. Deixar o Domain depender do Entity Framework Vi times colocando [Required] do EF direto nas entidades de domínio. Isso quebra a independência.

3. Criar Use Cases genéricos demais Cada Use Case deve fazer uma coisa só. GerenciarAlunoUseCase que faz tudo é um antipadrão.


Conclusão

Clean Architecture não é burocracia — é investimento. Os primeiros dias parecem mais lentos, mas em 3 meses você percebe que o time entrega mais rápido, com menos bugs e com muito mais confiança para mudar o código.

Na MIT Desenvolvimento de Sistemas, aplicamos esse padrão nos nossos sistemas BigSchool e MITransport — e os resultados em manutenibilidade e velocidade de entrega são concretos.

Quer modernizar a arquitetura da sua empresa? Fale com nossa equipe e agende uma consultoria.


Gostou? Compartilhe com seu time e acompanhe a Academia de Tecnologia para mais conteúdo técnico aplicado.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *