Domanda

Stiamo provando CQRS . Abbiamo una situazione in cui la convalida un CustomerService (servizio di dominio) ha bisogno di sapere se esista o meno un cliente. I clienti sono unici per il loro indirizzo email. Il nostro repository cliente (un repository generico) ha solo Get (id) e aggiungere (cliente). Come dovrebbe CustomerService scoprire se esiste il Cliente?

È stato utile?

Soluzione

Date un'occhiata a questo post del blog: validazione basata Situato nel CQRS Architettura .

Si affronta questo tema. E 'una questione complessa da affrontare in CQRS. Che Bjarte sta suggerendo è quello di interrogare il database di report per gli indirizzi di posta elettronica dei clienti esistenti e emettere un comando di compensazione (come ad esempio CustomerEmailAddressIsNotUniqueCompensatingCommand) di nuovo al modello di dominio se è stato trovato un indirizzo di posta elettronica. È quindi possibile sparare eventi appropriati, che può comprendere un UndoCustomerCreationEvent.

Leggere i commenti sul post del blog sopra per idee alternative.

Adam D. suggerisce in un commento che la convalida è una preoccupazione dominio. Di conseguenza, è possibile memorizzare ReservedEmailAddresses in un servizio che facilita la creazione del cliente ed è idratato da eventi nel tuo negozio di evento.

Non sono sicuro che ci sia una soluzione facile a questo problema che si sente completamente pulito. Fatemi sapere cosa si arriva con!

In bocca al lupo!

Altri suggerimenti

Questa problemi non devono essere quel complesso:

  1. Controlla il tuo negozio di reporting per l'unicità del cliente prima di inviare il comando UpdateCustomer.
  2. Aggiungi un vincolo al vostro DB per unicità su indirizzo di posta elettronica. Quando si esegue il comando, gestire l'eccezione e inviare una notifica all'utente utilizzando un canale di risposta. (Hences mai sparare eventi CustomerUpdated al negozio di riferimento.

Utilizzare il database per quello che è buono per e non farsi appeso su limitazioni ORM.

Questo post di Udi Dahan http://www.udidahan.com/ 2009/12/09 / chiarite-cqrs / contiene il seguente paragrafo:

"Inoltre, dovremmo non hanno bisogno di accedere al negozio query per elaborare i comandi - qualsiasi stato che è necessario dovrebbe essere gestito dal componente autonoma -. Che fa parte del significato di autonomia"

I belive Udi ha suggerito la semplice aggiunta di un vincolo univoco al database.

Ma se non avete voglia di farlo, sulla base della dichiarazione di cui sopra, vorrei suggerire semplicemente aggiungendo il metodo "ByEmail" al repository e da fare con esso - ma poi di nuovo Udi avrebbe probabilmente un suggerimento migliore. .

Spero di non sono troppo tardi ... ma abbiamo affrontato una situazione simile nel nostro progetto, abbiamo effettivamente intercettare il comando esecutore e fissarlo con il set di regole create per quel comando, che a sua volta utilizza una query per recuperare il i dati.

Quindi, in questo caso, possiamo avere una classe di nome, CustomerEmailMustBeUniqueRule, che viene prelevata dal RuleEngine quando il comando "RegisterCustomerCommand" sta per essere eseguito da RegisterCustomerCommandExecutor. Questa classe regola ha la responsabilità di interrogare il database per trovare se l'id-mail esiste e fermare l'esecuzione alzando la bandiera non valida ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top