Prima di tutto, ammetto che sono un novizio di DDD e ho bisogno di leggere il "libro blu".
Sto costruendo un sistema che ha una AggregateRoot di tipo "Match". Ogni partita può avere una raccolta di "Voti" e ha anche una proprietà "VoteCount" di sola lettura che viene incrementata quando un utente up-vota o down-vota una Partita.
Poiché molti utenti potrebbero votare su una partita contemporaneamente, i voti devono essere aggiunti / rimossi dalla partita e il VoteCount deve essere incrementato / decrementato come un'operazione atomica che coinvolge blocchi di scrittura (con blocchi gestiti dal DB ). (Ho bisogno di VoteCount come valore statico nel database per essere interrogato in modo efficiente da altri processi / componenti.)
Mi sembra che se fossi aderente al rigoroso DDD, avrei codificato questa operazione in quanto tale:
- Un servizio di applicazione riceverà un oggetto di richiesta di voto
- Il servizio recupera quindi l'oggetto Match da un repository delle corrispondenze
- Il servizio chiamerebbe quindi una sorta di metodo sull'oggetto Match per aggiungere il voto alla raccolta e aggiornare VoteCount.
- Il repository dovrebbe quindi mantenere tale istanza di corrispondenza sul DB
Tuttavia, questo approccio non è fattibile per la mia applicazione per 2 motivi principali, come vedo:
-
Sto utilizzando MongoDB sul back-end e non posso avvolgere questa operazione di lettura-scrittura in una transazione per impedire letture sporche dei dati di corrispondenza e dei relativi voti e voti associati.
-
È altamente inefficiente. Sto tirando indietro l'intero grafico degli oggetti solo per aggiungere un voto e incrementare VoteCount. Sebbene questo sia più efficiente in un documento db che in uno relazionale, sto ancora facendo un'operazione di lettura non necessaria.
Problemi 1 & 2 non sono un problema quando si invia un singolo oggetto Vote al repository e si esegue una dichiarazione di aggiornamento atomico contro Mongo.
Potrebbe votare, in questo caso, essere considerato un "aggregato" e meritarsi del proprio repository e dello stato aggregato?