Ao usar DDD e CRQS, deve haver exatamente um evento por comando?

17

Estou procurando uma maneira de projetar um aplicativo ddd com convenção sobre configuração.

Digamos que um "Cliente" agregado tenha um comando definido "FillProfile". Ele irá gerar logicamente um evento "ProfileFilled".

Existem casos em que um comando gera mais que um evento ou em que um comando gera eventos diferentes com base em alguma lógica? Ou esse é sempre um relacionamento 1 - 1 (1 comando sempre gera nenhum, ou um único evento de um determinado tipo).

Estou perguntando isso, porque se isso é um fato, que um comando sempre gera o mesmo evento, posso construir meu sistema de convenções sobre esse fato. Eu sei que "RaiseEvent" resultará em "EventRaised" ...

Ludovic C
fonte
1
se o comando fizer com que duas coisas aconteçam, você poderá esperar que cada coisa levante um evento. ProfileGenerated, ProfileSaved, também qualquer evento pode causar um erro que, novamente, pode gerar um evento
Ewan
Também é trivial que os sistemas implementem eventos BeforeCommand, AfterCommand etc.
Ewan
Ou o circuito de comando força ie FillProfiles () profileFilled, profileFilled ....
Ewan
@ Ewan, só quero te corrigir. Um evento de domínio não pode gerar um erro. Somente comandos podem. Eventos de domínio significam que algo aconteceu , pois comandos significam que há uma intenção de fazer algo acontecer, que pode ser recusado ou aceito. Em outras palavras, um erro deve ser gerado antes que um evento de domínio seja despachado (a menos que esse evento de domínio esteja relacionado ao log de erros, é claro).
Ludovic C

Respostas:

18

Como você marcou sua pergunta com "CQRS", acho que você quer dizer eventos em um contexto "CQRS e fornecimento de eventos", como descrito aqui . Em deste tutorial , a diferença entre os eventos e comandos é bem explicado:

  • eventos capturam as "coisas que podem acontecer" elementares em seu sistema, do ponto de vista do sistema.

  • comandos são definidos pelo que o usuário considera uma operação, do seu ponto de vista

E embora isso geralmente leve a alguns comandos e eventos com uma correspondência 1: 1, esses diferentes pontos de vista podem levar a comandos que disparam mais de um evento ou a eventos diferentes, dependendo dos parâmetros de comando. Posso até imaginar casos em que um comando não gera um evento, mas esse seria um caso muito excepcional, não muito típico.

Por exemplo, o tutorial menciona eventos

  • TabOpened
  • Bebidas
  • FoodOrdered

e comandos

  • OpenTab
  • Faça a encomenda

Aqui, o comando "OpenTab" levará a um evento "TabOpened", mas o comando PlaceOrder levará aos eventos "DrinksOrdered", "FoodOrdered" ou ambos.

De fato, se você estiver projetando um novo sistema "do zero", tente projetá-lo com uma correspondência 1: 1 entre comandos e eventos e veja quão bem isso é dimensionado quando o sistema se torna maior. Você pode até tentar uma abordagem híbrida: uma lista de eventos e comandos com uma correspondência 1: 1, juntamente com alguns comandos adicionais combinados. Apenas tente até que ponto isso o leva para o sistema específico que você está projetando.

Doc Brown
fonte
10

Normalmente, um comando leva a um evento. Mas, em alguns casos, também pode ser mais de um, depende da sua implementação.

Seu comando chama outros comandos e cada um deles aciona eventos próprios. Ou seu comando executa tarefas diferentes por si só e emite vários eventos. Por exemplo:

RegisterUserCommand

  • User.create (email, senha) → UserCreatedEvent
  • User.updateProfile (nome, sobrenome, local) → UserProfileUpdatedEvent
  • User.joinDefaultGroup () → UserJoinedGroupEvent
sintomático
fonte
O que acontece se você decidir mais tarde UserWasAddedToCrm? Reescrever todo o fluxo?
Mctyre321
@ mcintyre321 pesquisa coreografada vs eventos orquestrados
Benten 15/01
10

Um comando pode gerar vários eventos. É simplesmente conclusão lógica de um fato: Composite commandexiste.

Digamos que você tenha dois comandos, cada um levantando um evento. Em seguida, você cria um comando composto desses dois. Do ponto de vista de alguém usando o comando composto, parece que o comando gerou dois eventos.

Portanto, não há nada que impeça que você tenha um único comando gerando vários eventos (ou mesmo nenhum).

Eufórico
fonte