Principais conceitos sobre Domain Events - Full Cycle FullCycle

Voltar

Wesley Willians

Principais conceitos sobre Domain Events

10 min de leitura

O Domain Events é uma abordagem de Domain Driven Design cuja função é estabelecer quais são os eventos importantes que acontecem no coração do software e como podemos distribuí-los.

 

Use um evento de domínio para capturar uma ocorrência de algo que aconteceu no domínio.” — Citação de Vaughn Vernon em Implementando Domain Driven Design, publicado em 2013.

O domínio é o coração da aplicação, onde as regras de negócio são colocadas para que o sistema cumpra a sua função. Outros detalhes como formato e banco de dados podem ser deixados para depois, já que o domínio é a parte principal que nós devemos pensar quando desenvolvemos as nossas aplicações.

Pensando nas ocorrências que acontecem durante a criação das regras de negócio, existem operações que normalmente são partes importantes, como: change address, place order, create user, create product, change price, etc. Esses motivos de mudança significam que alguma coisa importante aconteceu no coração da aplicação, então nós estamos falando de eventos.

“A essência de um Evento de Domínio é que você o usa para capturar coisas que podem desencadear uma mudança no estado do aplicativo que você está desenvolvendo. Esses objetos de evento são então processados para causar alterações no sistema e armazenados para fornecer um Audit Log.” — Do artigo de Martin Fowler sobre Domain Events.

Isso quer dizer que as mudanças no estado da sua aplicação provavelmente vão gerar algum evento. Em outras palavras, se alguma coisa mudou no seu sistema, a mudança pode gerar um evento. Normalmente a mudança acontece no domínio, não necessariamente na camada da sua aplicação. Eventos como change address, increase price ou raise salary são mudanças típicas que podem ser consideradas um evento.

Regras

Numa ação representando a criação de um novo usuário, isso é um típico evento de User Created; se você criou uma nova ordem de serviço no sistema, o evento é o Order Placed; e o envio de um e-mail é um Email Sent.

Perceba que o evento é a consequência, ou reação, de uma ação que aconteceu no passado.

Quando utilizar o Domain Events?

Normalmente nós usamos um Domain Event quando precisamos notificar outros contextos delimitados sobre uma alteração no sistema. Logo, se você tem a sua aplicação, ela é parte de um contexto delimitado que faz sentido para ela.

Numa área de suporte ao cliente, por exemplo, as pessoas que trabalham nesse setor vão utilizar termos específicos para tratar os detalhes importantes que acontecem ali. O mesmo acontece na área de checkout da mesma empresa, já que ambas são contextos diferentes.

O contexto delimitado não significa necessariamente que são aplicações diferentes; já que é natural ter contextos diferentes dentro da mesma aplicação, mesmo que seja monolítica. E da mesma forma é possível ter contextos distintos em microsserviços diferentes.

Então normalmente nós emitimos um evento para que outros contextos consigam saber o que aconteceu; e não exclusivamente para o consumo do seu próprio contexto delimitado, já que em tese ele mesmo entende o que foi feito.

Componentes do Domain Events

  • 1º Event

O evento representa o que aconteceu, mostrando os dados, data e hora. Ele também pode ter um ID, que é o identificador, dependendo do que você decidir colocar e achar razoável ter em determinado evento.

  • 2º Handler

O handler executa o que foi declarado no evento. Pode ser um User Created, um Email Sent ou mesmo um outro handler de User Created que publica uma mensagem no RabbitMQ.

  • 3º Event Dispatcher

Esse componente armazena todos os eventos junto aos handlers executados. Você pode registrar um evento de User Created junto ao handler de envio de e-mail, assim como um outro evento de User Created para publicar no RabbitMQ. Basicamente o Event Dispatcher lista todos os eventos junto aos handlers executados.

Um detalhe é que o Event Dispatcher também executa o handler quando um evento acontece, então, ao notificar a criação de um novo usuário, por exemplo, o próprio Dispatcher busca todos os handlers registrados de User Created e executa cada um deles.

Essas nomenclaturas podem variar de acordo com cada desenvolvedor e seus padrões de linguagem convencionais. O pessoal de C#, por exemplo, costuma chamar isso de Event Raiser, enquanto outros chamam de Event Bus, mas no geral representam a mesma coisa.

Veja também: Clean Architecture: trabalhe em aplicações de grande porte!

Curtiu esse artigo? Se você quer aprender a implementar Domain Events de forma eficiente, solicite contato clicando aqui e nós te ajudamos.