Ho problemi nell'organizzazione del mio codice quando voglio aggiornare un oggetto dominio non semplice. Il problema è separare le responsabilità per il controller e il livello di servizio.Grails: l'uso del livello di servizio
In modo più esplicito, si supponga di disporre di un client di classe dominio che dipende da altre classi di dominio come Indirizzo e così via.
Nella vista è presente un gsp per modificare alcune proprietà dei client, incluse alcune delle proprietà nidificate come street sull'indirizzo.
Quando desidero aggiornare questi campi, chiamo il metodo di aggiornamento su un Controller (in questo caso il ClientController).
Mi piace la funzione proveniente dagli errori di una classe di dominio quando convalidata. Come se nel Controller scrivere
Client client = Client.get(params.id)
client.properties = params
client.validate()
Se il cliente ha ora errori è molto facile per visualizzarli nella vista edit.
Ma, ho pensato che l'aggiornamento, il salvataggio e il recupero del client dal database (Client.get (theId)) dovrebbero essere gestiti dal livello di servizio. Nel mio caso devo aggiornare o creare altri oggetti di dominio (come l'indirizzo) prima di aggiornare il client.
Quindi una delle mie domande è come dovrebbe apparire l'API per il livello di servizio?
public ... updateClient(…)
Nella letteratura hanno il banale esempio di aggiornamento dell'età di una persona. Quindi, la loro API è costituita dall'ID della persona e dalla nuova era. Ma, nel mio caso, ho una decina di parametri dalla vista e sono solo un sottoinsieme di tutte le proprietà di un client e non so quale di questi sia cambiato.
- Mi piacerebbe avere un client nel controller che possa convalidare e inviare nuovamente alla vista di modifica se ha errori di convalida.
- Vorrei gestire le interazioni e le transazioni del database dal livello di servizio.
Come posso combinare questi? Quali responsabilità dovrebbero avere i diversi livelli per quanto riguarda l'aggiornamento? Come dovrebbe apparire l'API del livello di servizio per quanto riguarda l'aggiornamento?
Se esiste una buona implementazione di riferimento, sarei felice di studiarla. Molte volte il livello di servizio è sfortunatamente totalmente o parzialmente ignorato.
+1 una domanda ben scritta. – David