Sto iniziando con DDD e capisco che le radici aggregate sono utilizzate per assicurare la coerenza transnazionale. Non dovremmo modificare più aggregati in un servizio applicativo.
Vorrei sapere comunque come affrontare la seguente situazione.
Ho una radice aggregata chiamata Prodotti.
Esiste anche una radice aggregata chiamata Gruppo.
Entrambi hanno Id e possono essere modificati indipendentemente.
Più prodotti possono puntare allo stesso gruppo.
Ho un servizio di applicazione che può modificare il gruppo di un prodotto:
ProductService.ChangeProductGroup(string productId, string groupId)
- Controlla il gruppo esiste
- Ottieni prodotto dal repository
- Imposta il suo gruppo
- Scrivi il prodotto nel repository
Ho anche un servizio applicativo in cui il gruppo può essere cancellato:
GroupService.DeleteGroup(string groupId)
1. Ottieni prodotti dal repository il cui groupId è impostato su groupId, assicurati che il conteggio sia 0 o che venga interrotto
2. Elimina gruppo dal repository di gruppi
3. Salva le modifiche
La mia domanda è il seguente scenario, cosa accadrebbe se:
Nel ProductService.ChangeProductGroup, controlliamo che il gruppo esista (lo fa), quindi subito dopo verifica che un utente separato cancelli il productGroup (tramite l'altro GroupService.DeleteGroup). In questo caso impostiamo un riferimento a un prodotto che è stato appena cancellato?
Questo è un difetto nel mio design in quanto dovrei usare un design di dominio diverso (aggiungendo ulteriori elementi se necessario), o dovrei usare le transazioni?