Domínio consulta em CQRS
-
19-09-2019 - |
Pergunta
Estamos tentando para fora CQRS . Temos uma situação de validação onde um CustomerService (serviço de domínio) precisa de saber se existe ou não um cliente. Os clientes são únicos pelo seu endereço de e-mail. Nosso repositório Cliente (um repositório genérico) só tem Get (id) e adicionar (ao cliente). Como deve ser a CustomerService descobrir se existe o cliente?
Solução
Dê uma olhada neste post: conjunto de validação com base na cQRS Arquitetura .
Ele aborda esta questão. É uma questão complexa de lidar com a CQRS. O que Bjarte está sugerindo é consultar o banco de dados de relatórios para endereços de clientes de e-mail existentes e emitir um comando de compensação (tal como CustomerEmailAddressIsNotUniqueCompensatingCommand
) de volta para o modelo de domínio, se um endereço de e-mail foi encontrado. Você pode, em seguida, disparar eventos apropriados, que pode incluir uma UndoCustomerCreationEvent
.
Leia os comentários sobre o post acima para idéias alternativas.
Adam D. sugere em um comentário que a validação é uma preocupação domínio. Como resultado, você pode armazenar ReservedEmailAddresses em um serviço que facilita a criação do cliente e é hidratada por eventos em sua loja evento.
Eu não estou certo que há uma solução fácil para esse problema que se sente completamente limpo. Deixe-me saber o que você venha com!
Boa sorte!
Outras dicas
Este questões não tem que ser complexo:
- Verifique sua loja relatórios para a singularidade do cliente antes de enviar o comando UpdateCustomer.
- Adicione uma restrição ao seu DB de exclusividade no endereço de e-mail. Ao executar o comando, tratar a exceção e envia uma notificação para o usuário usando um canal de resposta. (Hences não disparar eventos CustomerUpdated para a loja de relatórios.
Use o banco de dados para o que é bom para e não fique preso a limitações ORM.
Este post por Udi Dahan http://www.udidahan.com/ 2009/12/09 / esclarecidas-cqrs / contém o seguinte parágrafo:
"Além disso, não devemos precisar acessar a loja consulta aos comandos de processo - qualquer estado que é necessário deve ser gerido pelo componente autônomo - que é parte do significado da autonomia."
Eu acredito Udi sugeriu simplesmente adicionando uma restrição exclusiva à base de dados.
Mas se você não sentir vontade de fazer que, com base na declaração acima, gostaria de sugerir apenas adicionando o "ByEmail" método para o repositório e ser feito com ele - mas, novamente Udi provavelmente teria uma sugestão melhor. .
Hope Eu não sou demasiado tarde ... mas enfrentou uma situação semelhante no nosso projeto, nós realmente interceptar o comando executor e anexá-lo com o conjunto de regras criadas para esse comando, que por sua vez usa uma consulta para buscar o dados.
Portanto, neste caso, podemos ter uma classe com o nome, CustomerEmailMustBeUniqueRule que é buscado pela RuleEngine quando o comando "RegisterCustomerCommand" está prestes a ser executado por RegisterCustomerCommandExecutor. Essa classe de regras tem a responsabilidade de consultar o banco de dados para descobrir se a exist e-mail id e parar a execução levantando a bandeira inválido ...