2009-12-10 19 views
21

uno dei principi fondamentali della CQRS, se ho capito bene, è che i comandi devono essere un comportamento-centrica, e hanno un valore nel business o UL, e non data-centric, vale a dire., CRUD . Invece di concentrarci sull'aggiornamento di un cliente, abbiamo comandi come CustomerHasMoved. Cosa succede se si dispone di schermi CRUD che sono lì per correggere determinati dati. Ad esempio, abbiamo bisogno di cambiare il nome di un cliente che è errato. Questo non ha molto valore nel business. Questo dovrebbe essere solo sotto l'ombrello di un comando UpdateCustomer?CQRS e schermi CRUD

+4

In che modo il nome cliente corretto non ha valore per l'azienda? Ottenere il nome sbagliato potrebbe significare che le merci non vengono consegnate e che ci sono altri scenari ... – Oded

risposta

17

In realtà, potrebbero esserci vari motivi per aggiornare il nome di un cliente. Come stavi dicendo, potrebbe essere errato o ... potresti sposarti e cambiare il tuo nome in quello di tuo marito.

Se solo si avesse un comando UpdateCustomer, si perderebbe l'intento originale e non sarebbe in grado di avere comportamenti diversi per ciascuno di essi. Se il nome fosse errato, potrebbe essere semplice come aggiornare il database, mentre se il tuo cliente si è sposato potrebbe essere necessario notificare il dipartimento marketing in modo da poter offrire uno sconto.

Nel caso in cui la vostra entità sia puramente CRUD, cioè non vi è alcun intento che è possibile associare alla modifica delle proprietà, allora è OK avere un UpdateEntityCommand. È quindi possibile passare lentamente in qualcosa di più attività in base

+1

Esattamente, quindi cosa si può fare? Creare un comando per ogni singolo scenario possibile? – blockhead

+7

Sì, o almeno per ogni scenario che si desidera gestire. Nel mio esempio, inizieresti con CorrectMisspelledCustomerName e poi, se necessario, aggiungerai un comando MakeCustomerMarried. CQRS riguarda il comportamento, non l'aggiornamento dei dati. Pertanto non dovresti avere comandi generici per l'aggiornamento di cose nel tuo sistema. – Julien

+0

Cosa succede se ho un grande schermo con tutti i campi per il mio cliente. Spegnerei diversi comandi per gestirlo, o in qualche modo inventare una sorta di "comportamento" per quello. Forse non dovrei mai mostrare tutti i campi. – blockhead

0

CustomerHasMoved è l'evento che viene licenziato dopo aver aggiornato la posizione clienti. Questo evento aggiorna i database di lettura/i database della cache. Il comando dal gui dovrebbe essere MoveCustomer o qualcosa del genere. Penso che metterei l'aggiornamento del nome del cliente in un comando come UpdateCustomer.

37

voglio solo mettere un commento su questo rapidità con cui era spuntato.

E 'importante notare che alcuni oggetti sono in realtà CRUD e questo è ok. Forse non mi interessa davvero perché un nome sta cambiando nel mio dominio, dove spedisco prodotti alle persone e ho solo bisogno di quei dati per stampare etichette postali. Il trucco sta nel rendere il comportamento di default e poi tornare ad un'interfaccia CRUD una volta che sei sicuro di non preoccuparti dei motivi piuttosto che viceversa.

Greg

+0

Grazie per l'input @Greg. Stavo cercando su google tutto quello che avevi da dire su questi tipi di scenari CRUD. Immagino che l'occasionale CRUD sia ancora ok da usare in un approccio DDD, a patto che non ci sia assolutamente alcun comportamento da catturare insieme ad esso. –

+0

Voto positivo. Stiamo spendendo soldi qui per ottenere funzionalità (con la manutenzione secondo). Vuoi fare qualcosa di perfetto e bello, sii un artista. Pagati come uno, anche. Vedi il mio commento alla risposta di Julien. – FastAl