Stiamo provando ad adottare Domain-Driven Design nel nostro progetto per la prima volta. Il problema che ho è con le associazioni tra entità. Come li fai bene?Il modo giusto per implementare le associazioni in DDD?
Dire, ho entità Employee
e Contract
, una semplice associazione uno-a-molti. Come lo modifico?
Opzione 1: Aggregato.
Problema: Il problema qui è che, se ho capito bene, tutte le entità in un aggregato devono essere caricate quando viene creato un oggetto aggregato. Non riesco a caricare le entità pigre quando sono necessarie perché richiederebbe il riferimento a un repository di un'entità, che a quanto pare non è buona. Ma recuperare tutti i contratti di un dipendente dal database ogni volta sarebbe un grosso problema di prestazioni.
Opzione 2: Recupero contratti di un dipendente utilizzando un repository (ad esempio ContractRepository.GetContractsForEmployee()
) e aggiungendo EmployeeId
proprietà Contract
di classe.
Problema: rende difficile inserire qualsiasi logica aziendale in entità. Mi piacerebbe avere un metodo, per esempio, Employee.Dismiss()
, ma sarebbe anche necessario aggiornare il contratto del dipendente. Ciò significa che avrei bisogno di mettere questa logica in un servizio. Il problema è che non riesco a pensare a molte logiche che funzionano solo su un Employee
e quindi il modello diventerebbe alquanto anemico, con la maggior parte dei servizi logici interni.
Come gestite questi problemi in DDD?
Una volta che stai pensando 'una semplice associazione uno-a-molti' non stai facendo DDD, stai facendo la progettazione dello schema del database. Le associazioni tra entità dovrebbero essere comportamenti. Un Dipendente non può licenziarsi, deve essere licenziato (da un'altra entità che ha l'autorità per farlo). L'opzione 2 è quella giusta. Non devi inventare un sacco di comportamento per un'entità. Se un oggetto di dominio è molto semplice nel business reale, modellalo in questo modo. Importa come il Dominio definisce il concetto (la semantica) e non quanti metodi ha l'oggetto. – MikeSW
MikeSW è corretto. Un aspetto molto importante della DDD è Ubiquitous Language. Il modo in cui parli del dominio DEVE essere il modo in cui l'esperto del dominio parla del dominio, altrimenti il codice diventa scomodo e non intuitivo. Sembra banale, ma se capisci bene, le Entità iniziano a suggerire un comportamento. per esempio. Employee.Resign(); Contract.Terminate(); – Asher