Sto sviluppando un progetto software di grandi dimensioni che utilizza DDD (Domain-Driven Design). Ho un'entità che funge da radice aggregata, chiamiamola Root
. Questa entità fa riferimento a una raccolta di entità figlio del tipo Child
.
Poiché l'utilizzo di questa entità Child
è un dettaglio di implementazione che non interessa ai client della mia entità Root
, questi figli sono gestiti esclusivamente dall'entità Root
, ovvero dalla creazione di nuovi figli e dalla rimozione dei bambini esistenti si svolge tutto secondo metodi dell'entità Root
. Pseudocode potrebbe apparire come segue
class Root
{
private Collection<Child> children;
public void addChild(ChildParameters params)
{
this.children.append(new Child(params));
}
public void removeChildByCriteria(Criteria removalCriteria)
{
Child foundChild = this.children.findByCriteria(removalCriteria);
if (foundChild) {
this.children.remove(foundChild);
}
}
}
Penso che questo sia un approccio molto pulito se si guarda solo al modello dell'oggetto. Tuttavia, questo deve essere persistito da qualche parte, quindi un Repository
si occupa di memorizzare un'entità Root
e i suoi figli in un database.
Ora sto lottando per trovare il posto giusto in cui la logica rimuove un bambino persistente dal repository (e quindi dal database). Va bene lasciare che l'implementazione del repository trovi bambini orfani e rimuoverli automaticamente? O è la cancellazione della logica di dominio dei bambini orfani che dovrebbe essere esplicitamente codificata all'interno dell'entità root passando un repository al metodo removeChildByCriteria
come
// ...
public void removeChildByCriteria(Criteria removalCriteria, ChildRepositoryInterface childRepository)
{
Child foundChild = this.children.findByCriteria(removalCriteria);
if (foundChild) {
this.children.remove(foundChild);
childRepository.remove(foundChild);
}
}
// ...
O è sbagliato posizionare la logica per gestire la gerarchia all'interno dell'entità root e invece un servizio di dominio o eventi di dominio e secondo gli ascoltatori dovrebbero essere usati?