Trovo più interessante insistere su questo punto, piuttosto che sulla separazione tra canale di scrittura e canale di lettura.

Le query in CQRS non cambiano la verità.

Ci sono due informazioni importantissime in quella affermazione: cambiamento e verità.

Se l’unico modo per avere informazioni è attraverso una query sul modello in lettura significa che il modello in lettura rappresenta la verità. Questo in apparenza è in netto contrasto con il concetto di Aggregato di DDD, che è il detentore della verità e delle invarianti, e dal punto di vista CQRS il destinatario di comandi.

Quello che stiamo tralasciando è il punto di vista. Dal punto di vista del sistema la verità sono gli aggregati, gli aggregati garantiscono l’integrità dell’intero sistema. Dal punto di vista dell’utente la verità è quello che vede/legge e quindi, se abbiamo CQRS in mezzo, la verità è il modello in lettura.

E il cambiamento che ci azzecca in tutto questo?

A questo punto avete un interessante problema, guardando due facce della stessa medaglia c’è una alto rischio di vedere due cose diverse, nonostante la medaglia sia la stessa; possiamo quindi permetterci di usare una query per cambiare la verità? Possiamo usando un esempio permetterci di:

  1. chiedere al sistema l’elenco di tutti i clienti insolventi;
  2. se vi sono clienti involventi;
  3. avviare una pratica di recupero crediti con tutti i clienti insolventi;

La risposta è semplicemente no, perché tra 1 e 3 la verità potrebbe essere cambiata. Quello che potrebbe succede è che per puro caso finisce nella lista il nostro miglior cliente che ci aveva pure avvisato che per un disguido burocratico un pagamento sarebbe slittato.

Vogliamo veramente rischiare di usare una cosa non consistente, come una query, per cercare di cambiare la verità?

.m