Mi piace di più il post su CQRS di Udi Dahan, e prendo un esempio da lì:
Let’s say we have a customer service representative who is one the
phone with a customer. This user is looking at the customer’s details
on the screen and wants to make them a ‘preferred’ customer, as well
as modifying their address, changing their title from Ms to Mrs,
changing their last name, and indicating that they’re now married.
What the user doesn’t know is that after opening the screen, an event
arrived from the billing department indicating that this same customer
doesn’t pay their bills – they’re delinquent. At this point, our user
submits their changes.
Should we accept their changes?
Well, we should accept some of them, but not the change to
‘preferred’, since the customer is delinquent.
E, riguardo alla tua domanda
But how is that not possible with everyday CRUD operations?
Non c'è nulla come comando in CRUD per definizione. In CRUD abbiamo solo, uhm, CRUD: creare, leggere, aggiornare ed eliminare. Ecco come appare l'imitazione del comando con CRUD (di nuovo, è un estratto dal post di Udi Dahan):
But writing those kinds of checks is a pain – we need to do a diff on
the data, infer what the changes mean, which ones are related to each
other (name change, title change) and which are separate, identify
which data to check against – not just compared to the data the user
retrieved, but compared to the current state in the database, and then
reject or accept.
Non si tratta solo di prestazioni. Si tratta anche di migliorare l'esperienza utente complessiva. Se il comando è valido, ovvero intervalli di date, e-mail, ecc. (Che possono essere assicurati sul lato client), il server non deve restituire errori la maggior parte del tempo. È in grado di gestire eventuali incoerenze causate da comandi paralleli in modo asincrono e di notificare un client con, ad esempio, un'e-mail. Ciò è diventato possibile, come ha detto anche Constantin Galbenu, perché i comandi catturano un intento imprenditoriale. In caso di " race condition " puoi chiedere al tuo esperto di dominio cosa fare e lui sarà in grado di rispondere.