Sto iniziando con DDD e capisco che le radici aggregate vengono utilizzate per garantire la coerenza transnazionale. Non dovremmo modificare più aggregati in un servizio dell'applicazione.
Vorrei tuttavia sapere come affrontare la seguente situazione.
Ho una radice aggregata chiamata Products.
Esiste anche una radice aggregata chiamata Gruppo.
Entrambi hanno ID e possono essere modificati in modo indipendente.
Più prodotti possono puntare allo stesso gruppo.
Ho un servizio applicativo che può cambiare il gruppo di un prodotto:
ProductService.ChangeProductGroup(string productId, string groupId)
- Il gruppo di controllo esiste
- Ottieni il prodotto dal repository
- Imposta il suo gruppo
- Scrivi il prodotto nel repository
Ho anche un servizio applicativo in cui il gruppo può essere eliminato:
GroupService.DeleteGroup(string groupId)
1. Ottieni prodotti dal repository il cui groupId è impostato su groupId fornito, assicurati che il conteggio sia 0 o annulla 2. Elimina il gruppo dal repository dei 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 questo controllo un utente separato elimina il productGroup (tramite l'altro GroupService.DeleteGroup). In questo caso abbiamo impostato un riferimento a un prodotto che è stato appena eliminato?
È un difetto nel mio progetto il fatto che dovrei usare un design di dominio diverso (aggiungendo elementi aggiuntivi se necessario) o dovrei usare le transazioni?