Sono venuto da un mondo di script di transazione e sto appena iniziando a dare un'occhiata a DDD. Non sono sicuro del modo corretto di integrare una progettazione DDD con la persistenza del database. Questo è quello che ho:
Una classe di servizio chiamata OrganisationService la cui interfaccia contiene metodi per recuperare e salvare istanze di oggetti del dominio dell'organizzazione. L'organizzazione è una radice aggregata e ha altri dati ad essa correlati: membri e licenze. Primo database EF6 DBContext viene utilizzato all'interno di OrganisationService per recuperare le entità OrganisationDB e le relative entità MemberDB e LicenseDB. Questi vengono tutti trasformati in equivalenti della classe dell'oggetto dominio quando vengono recuperati da OrganisationService e caricati nell'oggetto dominio dell'organizzazione. Questo oggetto appare così:
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
}
Non sto usando il modello di repository in OrganisationService ... Sto usando EF stesso come repository poiché sembra che EF6 abbia reso il repository ampiamente ridondante ora.
A questo punto del progetto l'oggetto del dominio Organizzazione è anemico: assomiglia alla classe Organizzazione EF POCO. La classe OrganisationService assomiglia molto ad un repository!
Ora ho bisogno di iniziare ad aggiungere logica. Questa logica include la gestione di licenze e membri di organizzazioni. Ora nei giorni degli script di transazione aggiungerei metodi in OrganisationService per gestire queste operazioni e chiamare in un repository per interagire con il DB, ma con DDD credo che questa logica dovrebbe essere incapsulata all'interno dell'oggetto stesso del dominio dell'organizzazione ...
Questo è il punto in cui non sono sicuro di cosa dovrei fare: avrò bisogno di mantenere questi dati nel database come parte della logica. Significa che dovrei usare DbContext all'interno dell'oggetto Dominio dell'organizzazione per fare questo? Sta usando il repository / EF all'interno della cattiva pratica degli oggetti di dominio? Se è così, a chi appartiene questa persistenza?
public class Organisation
{
public IList<Member> Members { get; set; }
public IList<License> Licenses { get; set; }
public void AddLicensesToOrganisation(IList<License> licensesToAdd)
{
// Do validation/other stuff/
// And now Save to the DB???
using(var context = new EFContext())
{
context.Licenses.Add(...
}
// Add to the Licenses collection in Memory
Licenses.AddRange(licensesToAdd);
}
}
Dovrei invece semplicemente mormorare l'oggetto dominio dell'organizzazione in memoria e poi rimandarlo a OrganisationService per la persistenza? Poi devo tenere traccia di ciò che effettivamente è cambiato sull'oggetto (che è ciò che EF fa ai suoi POCO!). Mi sembra di sentire che EF non è solo una sostituzione del repository, ma potrebbe anche essere il livello del dominio!)
Qualsiasi consiglio qui è apprezzato.