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?

Foi útil?

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:

  1. Verifique sua loja relatórios para a singularidade do cliente antes de enviar o comando UpdateCustomer.
  2. 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 ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top