Pular para conteúdo

Aula 17 - .NET 8+ Avançado com Arquitetura Limpa e MediatR 🔷

Objetivo Pedagógico

Objetivo: Arquitetura corporativa em .NET 8 com Clean Architecture, padrão CQRS com MediatR, Minimal APIs de alta velocidade e validação com FluentValidation.


📑 1. Fundamentos Teóricos & Análise Técnica

O desenvolvimento moderno na plataforma .NET 8 combina os novos recursos da linguagem C# 12 com os princípios da Clean Architecture (Arquitetura Limpa) proposta por Robert C. Martin. O objetivo central é isolar as regras de negócio de detalhes voláteis como frameworks web, bibliotecas de interface ou motores de bancos de dados.

Os pilares da implementação moderna em .NET: 1. Padrão CQRS (Command Query Responsibility Segregation): Separação estrita entre operações de leitura (Queries) e operações de escrita (Commands). As leituras podem ser otimizadas com consultas diretas (via Dapper ou queries no-tracking), enquanto os comandos executam regras de negócio através de agregados de domínio. 2. MediatR e Pipeline Behaviors: O padrão Mediator desacopla os endpoints web dos handlers de negócio. Middlewares de pipeline interceptam as mensagens para executar validação com FluentValidation, telemetria e transações de forma transversal. 3. Minimal APIs: Endpoints diretos configurados via expressões lambda (app.MapPost(...)), dispensando a sobrecarga de reflexão de controllers tradicionais e acelerando o throughput de requisições.

📐 Arquitetura Conceitual & Diagrama de Fluxo

graph LR
    Client["Requisição HTTP: POST /orders"] --> MinimalAPI["Minimal API Endpoint"]
    MinimalAPI --> MediatR["MediatR (ISender.Send)"]
    MediatR --> Pipeline["ValidationBehavior (FluentValidation)"]
    Pipeline --> Handler["CreateOrderCommandHandler"]
    Handler --> Domain["Domain Entities & Rules"]
    Handler --> Repo["IOrderRepository"]
    style Client fill:#e1f5fe,stroke:#01579b
    style MinimalAPI fill:#fff3e0,stroke:#e65100
    style Pipeline fill:#ffebee,stroke:#c62828
    style Handler fill:#e8f5e9,stroke:#2e7d32

🔍 Pilares e Diretrizes Técnicas

Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Separação CQRS: Modelos de leitura e escrita independentes para máxima escalabilidade. - Pipeline Behaviors do MediatR: Interceptação transversal para validação, logging e tratamento de exceções. - Minimal APIs de Alto Rendimento: Geração de código eficiente em tempo de compilação sem reflexão desnecessária. - Inversão de Dependências: O núcleo de domínio (Domain) possui zero dependências de bibliotecas externas.


🛠️ 2. Implementação Prática em C# 12, .NET 8 e Clean Architecture

Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:

// CreateOrderCommand.cs (Comando CQRS com MediatR e C# 12)
using MediatR;
using FluentValidation;

namespace Empresa.Core.Application.Orders;

// 1. Comando CQRS como Record Imutável
public record CreateOrderCommand(string CustomerId, decimal TotalAmount) : IRequest<Guid>;

// 2. Validador com FluentValidation
public class CreateOrderCommandValidator : AbstractValidator<CreateOrderCommand>
{
    public CreateOrderCommandValidator()
    {
        RuleFor(x => x.CustomerId).NotEmpty().WithMessage("ID do cliente é obrigatório.");
        RuleFor(x => x.TotalAmount).GreaterThan(0).WithMessage("O valor total deve ser positivo.");
    }
}

// 3. Handler com Injeção de Dependência
public class CreateOrderCommandHandler : IRequestHandler<CreateOrderCommand, Guid>
{
    public async Task<Guid> Handle(CreateOrderCommand request, CancellationToken cancellationToken)
    {
        // Regra de negócio isolada
        var orderId = Guid.NewGuid();
        Console.WriteLine($"[Domain] Pedido {orderId} criado para cliente {request.CustomerId}");
        return await Task.FromResult(orderId);
    }
}

💡 Análise Passo a Passo do Código

  1. Record Imutável C# 12: public record CreateOrderCommand(...) define o contrato de entrada com imutabilidade e igualdade por valor nativa.
  2. Validador FluentValidation: Regras declarativas separadas da classe do comando, executadas automaticamente pelo pipeline do MediatR.
  3. Manipulador IRequestHandler: Processa o comando e retorna o ID gerado sem conhecimento de protocolos de transporte (HTTP, gRPC ou fila).

🎯 3. Próximos Passos & Sequência Didática