Eventos e unidade de trabalho
Por que o fato espera a confirmação, e o que acontece quando ela não vem.
Um evento é um fato que aconteceu. O nome no passado não é estilo: um evento chamado CriarPedido é um comando disfarçado, e quem o recebe acha que pode recusá-lo. Um PedidoCriado já aconteceu — quem escuta reage, e não decide.
dataforge
e := D.evento("PedidoPago", {"valor": 120})
e.valor := 0
// erro: o evento 'PedidoPago' ja aconteceu: ele nao muda.O evento fica guardado até a confirmação#
dataforge
publicados := []
action anotar(fato):
publicados.append(fato.nome)
u := D.unidade(publicar := anotar)
u.registrar(pedido, pedidos) // o agregado e o repositorio dele
assert len(publicados) is 0 // o mundo ainda nao sabe
u.confirmar()
assert len(publicados) is 2 // agora simTodas as invariantes antes de qualquer gravação#
A unidade confere todos os agregados registrados e só então grava qualquer um deles. Se a segunda gravação falhasse por invariante, a primeira já estaria no banco — e a transação de domínio teria vazado pela metade.
E não dá para desfazer o confirmado#
dataforge
u.confirmar()
u.desfazer()
// erro: nao da para desfazer o que ja foi confirmado.
// dica: publique um evento de compensacaoOs eventos já saíram, e quem reagiu a eles não tem como voltar atrás. A saída é a compensação — a mesma que a Saga do Arcane.Malha implementa quando a transação atravessa a rede.