DDD: onde colocar manipuladores de eventos de domínio?

13

Você poderia me dizer sua opinião de que camada é a correta para colocar manipuladores de eventos de domínio no DDD? Por exemplo, eu tenho o serviço de aplicativo para adicionar um novo contrato e gostaria de enviar uma notificação por e-mail para a pessoa de contato, quando o contrato foi adicionado, o mesmo ocorre com o remetente de e-mail (que lida com o evento ContractAdded event) ou com o serviço de domínio ou algo mais?

Toni
fonte

Respostas:

11

Coloco manipuladores de eventos de domínio na camada de aplicativo.

Evento de domínio é uma maneira de dizer às camadas externas (ou mundo externo) que algo aconteceu na camada de domínio. O que fazer com o evento depende do aplicativo. O aplicativo pode notificar o usuário sobre alterações ou pode chamar outro domínio para fazer alguma coisa. O aplicativo é responsável por orquestrar as operações do domínio em reação às ações do usuário, solicitações da web ou eventos do domínio.

Eugene Khudoy
fonte
1
+1 para a camada do aplicativo. Em um design pub-sub, o evento de domínio pode ativar a lógica genérica em diferentes locais / sistemas / microsserviços. Se um dos assinantes for um aplicativo modelado usando DDD, o evento está acionando algum processamento nesse aplicativo / BC. Esse processamento pode exigir demarcação de transação, controle de acesso, coordenação que normalmente é executada na camada de aplicação.
Paulo Merson
2

O livro DDD original (Evans 2004) explica a camada de aplicação como uma camada fina que exercita objetos de domínio em resposta à ação do usuário. Manipuladores de eventos típicos para eventos de domínio, portanto, não pertencem à camada do aplicativo.

Pode fazer sentido colocar alguns deles na camada de domínio, desde que você não quebre as camadas criando uma dependência ascendente.

Se você tiver uma camada de infraestrutura abaixo da camada de domínio, o manipulador de eventos não poderá estar lá, pois isso quebraria as camadas.

Se você tiver uma camada de adaptadores acima da camada de domínio, poderá criar um manipulador de eventos lá. Confira a arquitetura hexagonal .

Gudmundur Orn
fonte
2

Coloco manipuladores de eventos de domínio na camada Domínio como uma interface de domínio IDomainEventHandler.

Um exemplo de manipulador de eventos de domínio é uma política que assina determinado evento de domínio para inicializar uma nova transação (por exemplo: para acionar um novo comando de domínio); portanto, faz sentido tê-lo na camada Domínio, pois está relacionado a logíca de negócios.

Podemos pensar em um exemplo em que um pedido é confirmado e, portanto, uma solicitação de fatura deve ser criada. Temos um evento OrderConfirmedEventque aconteceu. Uma política em nosso domínio seria responsável por se inscrever neste evento e criar um comando de domínio RequestInvoiceque será tratado pelo manipulador de comandos e tratado por ele de acordo.

Se tivéssemos esse manipulador de eventos na camada de aplicativos, isso significaria que a camada de aplicativos, além de orquestrar as ações do usuário, executaria alguma lógica de negócios, o que parece incorreto.

No entanto, temos

diegosasw
fonte