Questa domanda è più di una domanda generale su come modellare relazioni uno-a-molti semplici usando le collezioni: una modifica di una voce di elenco dovrebbe riflettersi nella versione dell'aggregato che la contiene?
Il dominio riguarda la pianificazione delle riunioni (come in Outlook). Ho un'entità della riunione, che può avere più partecipanti. Un partecipante può accettare / rifiutare le richieste di riunione. La riprogrammazione di una riunione annulla tutte le conferme dei partecipanti.
Ho pensato a due modi per modellarlo.
Opzione 1 L'aggregato della riunione conterrà un elenco di partecipanti in cui ogni partecipante ha un ID del partecipante e uno stato (accettato / negato). Il problema qui è che ogni comando Accetta o Nega, per uno specifico partecipante, incrementa la versione della riunione, il che significa che due partecipanti entreranno in una condizione di competizione se provano ad accettare la richiesta di riunione in base alla stessa versione originale. Sebbene ciò possa essere risolto rileggendo il documento della Riunione e riprovando il comando Accetta, è piuttosto fastidioso considerare quanto spesso ciò potrebbe accadere. Un altro approccio è quello di ignorare la versione della riunione quando si esegue il comando Accetta, ma questo introduce un nuovo problema: cosa succede se, dopo aver inviato le convocazioni di riunione, la riunione è stata riprogrammata? In questo caso non possiamo permetterci di ignorare la versione del Meeting, perché questa volta la versione DOES rappresenta una versione reale che dovrebbe essere considerata. A proposito, è una buona pratica ignorare la versione in alcuni dei comandi e non in altri?
Opzione 2 Estrarre un aggregato di partecipazione da Riunione. La partecipazione avrà MeetingId, ParticipantId e Status. Avrà anche una sua versione. In questo modo, quando il partecipante X accetta la richiesta di riunione, solo la relativa partecipazione sarà modificata e il resto verrà lasciato intatto. E, al momento di riprogrammare la riunione, verrà pubblicato un evento "Riunione riprogrammata" e un gestore di eventi risponderà ripristinando tutti gli stati delle Partecipazioni su "Non accettato", indipendentemente dalla versione corrente. Da un lato questo sembra logico, nel senso che la versione di una riunione non dovrebbe essere incrementata solo perché qualcuno ha accettato / negato la sua richiesta. D'altro canto, modellare la partecipazione come aggregato autonomo non mi sembra molto giusto, perché non ha alcun significato al di fuori del contesto dell'incontro.
Ad ogni modo, mi piacerebbe avere un feedback su questo e vedere i vari approcci a questo problema.