Stavo leggendo una domanda simile su SO: How update an entity inside Aggregate, ma non sono ancora sicuro di come un'interfaccia utente dovrebbe interagire con le entità all'interno di un aggregato.Aggiornamento di un'entità all'interno di un aggregato
Diciamo che ho uno User
, con un gruppo di Address
es. L'utente è la radice aggregata, mentre l'indirizzo esiste solo all'interno dell'aggregato.
In un interfaccia web, un utente può modificare i suoi indirizzi. In sostanza, ciò che accade è:
- L'utente vede un elenco di indirizzi sulla sua interfaccia web
- Si fa clic su un indirizzo, e viene reindirizzato a questa pagina:
edit-address?user=1&address=2
- In questa pagina, ottiene un forma in cui può modificare questo indirizzo.
ho abbiamo deciso di bypassare la radice di aggregazione, questo sarebbe semplice:
- Vorremmo caricare direttamente il
Address
con la suaId
- Vorremmo aggiornarlo, quindi salvarlo
Perché vogliamo farlo in modo DDD, abbiamo diverse soluzioni:
O noi chiedere all'utente di ottenere questo Discorso di Id:
address = user.getAddress(id);
address.setPostCode("12345");
address.setCity("New York");
em.persist(user);
Il problema di questo approccio è, IMO, che la radice di aggregazione ancora non ha molto più controllo su ciò che viene fatto con l'indirizzo. Restituisce solo un riferimento ad esso, quindi non è molto diverso dall'esclusione dell'aggregato.
Oppure si diciamo l'aggregato per aggiornare un indirizzo esistente:
user.updateAddress(id, "12345", "New York");
em.persist(user);
Ora l'aggregato ha il controllo su ciò che è fatto con questo indirizzo, e può prendere le misure necessarie che va con l'aggiornamento di un indirizzo.
O trattiamo l'indirizzo come un oggetto valore, e non ci aggiorniamo il nostro
Address
, ma piuttosto eliminarlo e ricrearlo:user.removeAddress(id);
address = new Address();
address.setPostCode("12345");
address.setCity("New York");
user.addAddress(address);
em.persist(user);
Quest'ultima soluzione sembra elegante, ma indica che un indirizzo non può essere un'entità. Quindi, cosa succede se deve essere trattata come un'entità, ad esempio perché un altro oggetto business all'interno dell'aggregazione ha un riferimento ad esso?
Sono abbastanza sicuro che mi manca qualcosa qui per comprendere correttamente il concetto di aggregazione e come è usato in esempi di vita reale, quindi per favore non esitate a dare i vostri commenti!
Grazie. Questo ha davvero senso, anche se non sono sicuro di come implementare un metodo 'changeAddress()'. L'esempio sopra è una semplificazione eccessiva e un indirizzo potrebbe essere composto da una dozzina di campi, tra cui il nome della via, il numero dell'edificio, il punto 'LatLng' per la posizione esatta sulla mappa, ecc.Cosa suggerisci allora, metti tutti questi parametri negli argomenti del metodo, o crea una sorta di oggetto transitorio dal form (sarebbe anche un oggetto 'Address'?), E passalo come argomento a questo metodo? – Benjamin
Ho aggiunto codice di esempio per lo scenario più comune. Non mi preoccuperei del numero di campi - DDD in realtà non riguarda i dati, riguarda le relazioni e la gestione della complessità. – kstaruch