PMQ.Domain
678 downloads · o mais recente da suíte · repositório
Os blocos de construção de DDD: entidade, raiz de agregado, objeto de valor e evento de domínio.
O problema
Todo projeto que faz DDD reescreve as mesmas quatro classes base, e cada um erra num detalhe diferente: entidade comparada por referência em vez de por identidade, objeto de valor mutável, evento publicado antes de a persistência confirmar.
As decisões, no código
Entidade herda de Validatable. Invariante quebrado vira notificação acumulada na própria
entidade, nunca exceção, e é o PMQ.Notifications entrando como base do domínio, e não como
camada por cima dele. O raciocínio está escrito na classe:
/// Inherits Validatable: a broken invariant becomes a notification accumulated on the entity,
/// never an exception. Exceptions are for programming errors — a violated business rule is an
/// expected outcome, and unwinding the stack for it both costs more and reports only the first
/// problem instead of all of them.
public abstract class Entity<TId> : Validatable, IHasDomainEvents, IEquatable<Entity<TId>>
where TId : notnull
Igualdade por identidade, dita em voz alta. Duas instâncias com o mesmo Id são a mesma
entidade ainda que todo o resto difira. É a definição de DDD e é onde mais se erra, então está na
documentação da classe junto com o encaminhamento: para semântica de valor, use ValueObject ou
record.
Construtor sem parâmetro, explicado. Existe porque ORM precisa, e está anotado dizendo isso: sem a nota, o próximo a ler remove achando que é sobra.
/// <summary>Parameterless constructor required by ORMs such as Entity Framework Core.</summary>
protected Entity() { }
Evento acumulado, não publicado. A entidade guarda os eventos numa lista privada e expõe
IReadOnlyCollection; quem despacha é a camada de aplicação, depois que a transação confirma.
Publicar no momento em que o evento nasce entrega efeito colateral de uma operação que ainda pode
falhar.
O tamanho é a proposta
Seis arquivos, 533 linhas contando documentação. Não tem repositório genérico, não tem unidade de trabalho, não tem barramento de eventos. Biblioteca de blocos de domínio que traz infraestrutura junto obriga o consumidor a aceitar decisões de persistência que não são dela.