Domain-Driven Design (DDD) é uma abordagem arquitetural que coloca o foco no núcleo do negócio. Ela propõe modelar o software com base em regras de negócio reais, usando uma linguagem comum entre devs e especialistas. Em sistemas .NET, essa abordagem é perfeitamente compatível com padrões como Clean Architecture, CQRS, e o uso de ferramentas modernas como Entity Framework, MediatR e ASP.NET Core.
🧠 Princípios-Chave do DDD
Conceito | Definição |
---|---|
Domínio | Área central do problema que o sistema resolve |
Modelo de Domínio | Representação do conhecimento do domínio em código |
Entidade | Objeto com identidade única (ex: Cliente, Pedido) |
Value Object | Objeto imutável sem identidade, definido por seus valores (ex: CPF) |
Aggregate | Conjunto de entidades e VOs com regras de consistência |
Root Aggregate | Entidade raiz que gerencia o agregado |
Repository | Interface para persistência de agregados |
Bounded Context | Fronteira lógica onde o modelo é consistente |
Linguagem Ubíqua | Vocabulário comum entre devs e especialistas |
🏗️ Estrutura de Projeto Sugerida
src/ ├── Domain/ ├── Application/ ├── Infrastructure/ └── WebAPI/
🔧 Exemplo Prático: Sistema de Pedidos
Entidade Pedido
public class Pedido { public Guid Id { get; private set; } public DateTime CriadoEm { get; private set; } private readonly List<ItemPedido> _itens; public IReadOnlyCollection<ItemPedido> Itens => _itens; public Pedido() { Id = Guid.NewGuid(); CriadoEm = DateTime.UtcNow; _itens = new List<ItemPedido>(); } public void AdicionarItem(string produto, decimal preco, int quantidade) { if (string.IsNullOrWhiteSpace(produto)) throw new DomainException("Produto inválido."); _itens.Add(new ItemPedido(produto, preco, quantidade)); } public decimal ObterTotal() => _itens.Sum(i => i.Total()); }
Value Object: ItemPedido
public class ItemPedido { public string Produto { get; } public decimal PrecoUnitario { get; } public int Quantidade { get; } public ItemPedido(string produto, decimal preco, int quantidade) { Produto = produto; PrecoUnitario = preco; Quantidade = quantidade; } public decimal Total() => PrecoUnitario * Quantidade; }
🔌 Repositório + EF Core
public interface IPedidoRepository { Task<Pedido> ObterPorIdAsync(Guid id); Task AdicionarAsync(Pedido pedido); }
public class PedidoRepository : IPedidoRepository { private readonly DbContext _context; public PedidoRepository(DbContext context) => _context = context; public async Task<Pedido> ObterPorIdAsync(Guid id) => await _context.Set<Pedido>().FindAsync(id); public async Task AdicionarAsync(Pedido pedido) { await _context.Set<Pedido>().AddAsync(pedido); await _context.SaveChangesAsync(); } }
🚀 Aplicando CQRS com MediatR
Comando
public record CriarPedidoCommand(List<ItemDTO> Itens) : IRequest<Guid>;
Handler
public class CriarPedidoHandler : IRequestHandler<CriarPedidoCommand, Guid> { private readonly IPedidoRepository _pedidoRepository; public CriarPedidoHandler(IPedidoRepository repo) => _pedidoRepository = repo; public async Task<Guid> Handle(CriarPedidoCommand request, CancellationToken cancellationToken) { var pedido = new Pedido(); foreach (var item in request.Itens) pedido.AdicionarItem(item.Produto, item.Preco, item.Quantidade); await _pedidoRepository.AdicionarAsync(pedido); return pedido.Id; } }
✅ Boas Práticas
- Modele a linguagem do negócio antes de começar a codar.
- Use DDD somente onde há complexidade de domínio.
- Mantenha regras dentro das entidades, evitando serviços anêmicos.
- Evite acoplamentos entre Bounded Contexts diretamente.
- Utilize testes unitários focando no comportamento do domínio.
📦 Ferramentas Úteis no Ecossistema .NET + DDD
Ferramenta | Finalidade |
---|---|
Entity Framework Core | ORM e persistência |
MediatR | Implementação de CQRS |
AutoMapper | Conversão entre modelos e DTOs |
FluentValidation | Validação de entrada |
Serilog | Logging estruturado |
Swashbuckle/Swagger | Documentação automática da API |
📘 Conclusão
DDD é uma abordagem que dá estrutura e clareza ao desenvolvimento de sistemas complexos. Em vez de focar apenas em tecnologia, ele prioriza o negócio, as regras e a linguagem da empresa. No ecossistema .NET, temos suporte maduro para aplicar os padrões recomendados e escalar sistemas com qualidade e robustez.
Top comments (0)