Competências

Modelagem de domínio, DDD e CQRS

nível aplicado-em-producaoligações 16 apurado em 13/08/2026

Colocar a regra no domínio, não no controller nem na procedure. Entidade que protege o próprio invariante, transição de estado explícita, e comando separado de consulta.

A prova mais direta é pública

O código corporativo ninguém de fora pode ler, então o que sustenta esta competência são os pacotes que eu publiquei. PMQ.Domain tem entidade com igualdade por identidade, raiz de agregado, objeto de valor e evento de domínio. PMQ.Mediator tem pipeline de comportamento e integração de validação. Estão no NuGet, com 1.432 downloads no mais baixado da suíte, e o código está aberto.

Validação declarativa aparece em 54% dos meus repositórios.

O que eu faço

  • Modelar agregado com invariante protegido no próprio tipo, em vez de validar no serviço
  • Implementar transição de estado como regra ordenada e explícita, onde a ordem das cláusulas é a precedência
  • Separar comando de consulta, com handler por caso de uso e pipeline de validação antes da execução
  • Usar notification pattern: regra de negócio violada devolve notificação acumulada, não exceção
  • Emitir evento de domínio no ponto de mudança e reagir fora do fluxo principal
  • Escrever objeto de valor para o que o sistema trata como conceito, não como string

Transição de estado como regra ordenada

Modelar assim tem uma consequência que eu defendo: ler o código de cima para baixo passa a ser ler a política. Quem lê a cadeia na ordem entende qual regra ganha de qual sem precisar simular. O custo é que inserir uma regra no meio vira mudança de comportamento e não acréscimo, o que força a decisão a ser consciente.

A decisão que eu defendo

Validação como dado em vez de exceção. Exceção interrompe o fluxo e devolve o primeiro erro, e a operação real quer devolver todos os problemas de uma vez. Regra de negócio quebrada é resultado esperado, não falha do programa. Foi por isso que PMQ.Notifications existe, e o raciocínio completo está em ADR 2 — Notificação acumulada em vez de exceção.

Onde apliquei

Pagamentos e antifraude · Assinaturas e recorrência · Monitoramento industrial · Comissionamento · Logística reversa e devoluções

O que eu ainda não fiz

Não apliquei event sourcing nem CQRS com base de leitura separada fisicamente. O meu CQRS é separação de responsabilidade dentro do mesmo banco, o que resolve o problema de organização e não o de escala de leitura.

Ver também

Suíte PMQ · Backend .NET · Qualidade e engenharia de contexto

Pablo Mickael Quevedo Senior Software Engineer · autor principal de 32 sistemas · Novo Hamburgo, RS

16 notas ligadas a esta

A vizinhança desta estrela no céu do portfólio.

Explorar a galáxia →