Sei que a dúvida não é relacionada ao domínio, mas sim sobre persistência. De qualquer forma, me bateu essa dúvida aqui.
Se eu tenho eventos sendo publicados e escutados, terei objetos sendo instanciados e/ou alterados. E se a regra de transação, dando um exemplo, for de comittar tudo ou dar rollback, como eu faço para garantir essa transação? Pois se for pra basear no que já estudei, não acredito que seja prudente deixar o pool de conexão aberto para ir carregando ele por cada evento.
Para dar um exemplo fora do praticado na aula, imaginem que eu tenho um pagamento sendo recebido e que deve ser validado. Após a validação, o pagamento recebido vira um Pagamento Efetivado ( daqui pra frente só regra de domínio). O sistema publica um evento de Pagamento Efetivado que é ouvido pelo Gerenciador de Crédito, que publica o Crédito, e é ouvido pelo Gerador de Movimentação Financeira que cria uma NOVA MOVIMENTAÇÃO à partir do crédito publicado. Movimentação financeira também publica essa movimentação, que é ouvida pelo Atualizador de Fatura.
A atomicidade que me refiro, está entre inserir uma nova movimentação e atualizar a fatura. Porém, como são eventos diferentes, ficou difícil pra eu entender como commitar as duas de uma vez (ou dar rollback no processo se uma delas falhar).
- Eu deveria carregar a transação no parâmetro? Parece que eu violaria o domínio com informações de infra fazendo isso.
- Eu deveria criar uma interface "transacional" para estabelecer um contrato comum entre os casos de uso que devem gerar uma transação única?
- Eu deveria utilizar outro padrão em vez do Observer para trabalhar melhor com o nível de atomicidade necessária e com menos dor de cabeça?
- Eu deveria criar uma classe chamada "GerenciadorDeTransação" e adicionar cada transação numa lista para, somente no fim do processo, realizar o commit ou rollback? Isso não faria utilizar processamento desnecessário?
Como dá pra perceber, preciso mesmo de ajuda