Quindi dove dovrei chiamare l'aggiornamento sui metodi del repository?
In un'architettura stereotipo DDD repository è solitamente chiamato da un servizio applicazione. Un servizio di applicazione è una classe che funge da facade che incapsula il tuo dominio e implementa casi di utilizzo del dominio orchestrando oggetti di dominio, archivi e altri servizi.
Non ho dimestichezza con il tuo dominio, ma suppongo che c'è un caso d'uso che sposta un State
da un Quadrant
in una Field
ad un altro. Come hai affermato, lo Field
è l'AR. Così si avrebbe un FieldApplicationService
riferimento a un FieldRepository
:
public class FieldApplicationService
{
readonly FieldRepository fieldRepository;
public void ShiftFieldState(int fieldId, string quadrant, string state)
{
// retrieve the Field AR
var field = this.fieldRepository.Get(fieldId);
if (field == null)
throw new Exception();
// invoke behavior on the Field AR.
field.ShiftState(quadrant, state);
// commit changes.
this.fieldRepository.Update(field);
}
}
Il servizio di applicazione è di per sé molto sottile. Non implementa alcuna logica di dominio; esso orchestra e imposta solo le basi per l'esecuzione della logica di dominio che include l'accesso al repository. Tutto il codice dipendente dal tuo dominio, come il livello di presentazione o un servizio, invocherà la funzionalità del dominio attraverso questo servizio applicativo.
Il repository può essere implementato in vari modi. Può essere con un ORM come NHibernate, nel qual caso il monitoraggio delle modifiche è integrato e l'approccio abituale è quello di impegnare tutte le modifiche anziché chiamare un aggiornamento esplicito. NHibernate fornisce anche uno Unit of Work che consente di eseguire le modifiche a più entità come se fossero una sola.
Nel tuo caso, come hai affermato, non è necessario tenere traccia delle modifiche, quindi è necessaria una chiamata esplicita all'aggiornamento ed è responsabilità dell'implementazione del repository gestirla. Se si utilizza SQL Server come database, il metodo Update
nel repository può semplicemente inviare tutte le proprietà di un Field
a una stored procedure che aggiornerà le tabelle secondo necessità.
Domanda: Cosa succede se * non è chiaro quali aggregati sono stati modificati *? Per esempio.il servizio applicativo chiama 'bookLendingService.LendBookToClient (book, client)'. Salva il libro? Salva cliente? Come possiamo essere certi che il servizio applicativo * conosca * e che questo non cambi mai? – Timo
Ho sentito parlare di una regola di mutazione di un solo aggregato per transazione, che potrebbe essere una risposta alla mia domanda di cui sopra. In tal caso, qual è la ragione di questa regola? E come si fa a gestire uno scenario che richiede modifiche a più aggregati? – Timo