Modelagem de domínio, DDD e CQRS
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