Quando ci aspettiamo di generare più di un modello in lettura a fronte di una singola modifica le cose diventano un filino più complesse di quelle che abbiamo descritto fino ad ora.
Il commento di Fabio centra appieno uno dei problemi:
Supponiamo uno scenario del tipo:
- Cerco un cliente in anagrafica
- Non lo trovo tra i risultati
- Pigio il pulsante “Nuova anagrafica cliente”
- Creo il cliente
- Torno ai risultati della ricerca
Il punto [5] è quello interessante, il modello in lettura che ci serve in quello scenario è quello specifico dei risultati della ricerca. Quello che viene generato, ad esempio, per la vista in lettura di una singola anagrafica non va bene.
Siccome lato back-end è difficile sapere quale sia il flusso che sta seguendo l’utente, quello che siamo costretti a fare è notificare il client della creazione di tutti i modelli in lettura possibili dato un aggregato che è stato modificato. In questo modo il client, conscio dello stato, può decidere quando l’operazione asincrona è effettivamente completata, per l’utente che la sta eseguendo.
La cosa risulta essere ancora più complessa, e sfocia nello sbagliato secondo la mia esperienza, se uno o più dei modelli che abbiamo bisogno di generare vive in un contesto diverso da quello in cui è avvenuta la modifica. Questo tipicamente succede quando scegliamo, seconda scelta sbagliata a mio modo di vedere, di veicolare gli eventi verso i denormalizzatori come messaggi su una coda. Che è anche relativo ad uno dei falsi miti di cui ho parlato tempo fa.
Appena decidiamo di mettere un evento di dominio, che ha due caratteristiche essenziali:
- è interno al contesto
- è ricco, o fat come si suol dire
su una coda corriamo il rischio che chiunque possa sottoscriversi a quell’evento, guidandoci inevitabilmente verso un bel monolite distribuito. La soluzione, all’apparente necessità di modelli in lettura che provengono dalla stessa fonte in contesti diversi è, come abbiamo già detto, ViewModel composition.
Quello della ricerca di informazioni resta sempre un nodo aperto, soprattutto in un sistema distribuito. Ne parleremo.