Dizem que no CQRS é fácil corrigir um erro, você apenas reimplementa e reproduz os eventos.
Mas, e se um dos eventos fizer com que um sistema externo que não esteja sob seu controle "envie um item" para o cliente se você apenas reproduzir os eventos, o item será enviado duas vezes.
Como você resolve isso?
Do artigo de Martin Fowler sobre fornecimento de eventos :
Portanto, quando você precisa restaurar o estado do seu sistema para um determinado momento, reproduz o estado armazenado , não os manipuladores de eventos, até aquele momento.
Dito isto, se você estiver trabalhando apenas com dados do estado, não deverá haver efeitos no sistema externo. A menos que você tenha gatilhos ou observadores em seu armazenamento de eventos, nesse caso, você deve desativá-los pela duração da restauração. Como você diz que não tem controle sobre o sistema externo, não deve haver nenhuma tentativa de restaurar seu estado usando a API exposta, pois você não sabe quais efeitos colaterais podem ter no sistema deles. Se a restauração colocar o sistema em um estado intermediário (por exemplo, devido a falhas nas operações no sistema externo), isso não deverá ser da responsabilidade de uma repetição de evento.
fonte
Para escolher um exemplo específico, vamos considerar como uma abordagem "pelo menos uma vez" aos efeitos colaterais pode funcionar.
Portanto, o modelo de domínio rastreia o que precisa ser feito; mas deixa o real fazendo para o aplicativo
No contexto da execução de um comando, a ideia básica parece a mesma. Os efeitos colaterais reais ocorrem fora da transação que atualiza o modelo.
Portanto, os testes de unidade para o seu modelo podem parecer algo como
Os principais pontos aqui sendo
fonte