Vengo 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 un progetto DDD con la persistenza del database. Questo è quello che ho:
Una classe di servizio denominata OrganisationService la cui interfaccia contiene metodi per il recupero e il salvataggio di istanze di oggetti di dominio dell'organizzazione. L'organizzazione è una radice aggregata e ha altri dati ad essa correlati: membri e licenze. Prima DBContext del database EF6 viene utilizzato all'interno di OrganisationService per recuperare le entità OrganisationDB e le entità MemberDB e LicenseDB correlate. Tutti questi vengono trasformati nei loro equivalenti di classe di oggetti di dominio quando vengono recuperati da OrganisationService e caricati nell'oggetto di dominio Organizzazione. Questo oggetto si presenta 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 in quanto sembra che EF6 abbia ampiamente ridondato il repository ora.
A questo punto nella progettazione l'oggetto di dominio Organizzazione è anemico: sembra la classe Organizzazione EF POCO. La classe OrganisationService assomiglia molto a un repository!
Ora devo iniziare ad aggiungere la logica. Questa logica include la gestione di licenze e membri di un'organizzazione. 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 di dominio dell'Organizzazione stesso ...
È qui che non sono sicuro di cosa dovrei fare: dovrò conservare questi dati nel database come parte della logica. Questo significa che dovrei usare DbContext all'interno dell'oggetto del dominio Organizzazione per fare questo? L'utilizzo del repository / EF all'interno dell'oggetto dominio è una cattiva pratica? In tal caso, dove 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 mutare l'oggetto di dominio dell'organizzazione in memoria e quindi rimandarlo a OrganisationService per la persistenza? Quindi devo tenere traccia di ciò che è effettivamente cambiato sull'oggetto (che è ciò che EF fa ai suoi POCO! Sto pensando che EF non è solo un sostituto del repository, ma potrebbe anche essere il livello di dominio!)
Qualsiasi consiglio qui è apprezzato.