Una radice aggregata può cambiare la "radice" di un'entità?

3

Ho qualche dubbio con Agreggate Roots e con le Entità.

Immagina di avere un oggetto Box, che contiene patate. In questo caso e in un punto di vista DDD, l'Aggregate Root sarebbe l'oggetto Box, quindi nel caso in cui vogliamo aggiungere patate al Box, dobbiamo farlo attraverso l'oggetto box.

Ora, immagina di dover cambiare una specifica Patata in un'altra Scatola. Questo è, abbiamo Box A (con Potato A) e Box B. Vogliamo spostare la Patata A nel Box B.

La mia prima idea è di creare un metodo all'interno dell'oggetto Box, che cambi la radice "Potato" (perché non possiamo farlo dalla stessa Patata). Tutta la logica è nell'oggetto root, quindi sembra Ok per me.

È un buon approccio farlo in questo modo? O nel caso in cui siano coinvolte due radici aggregate (dello stesso tipo), dobbiamo creare un servizio invece?

Alcuni codici

public class Box {

    private List<Potato> potatoes;

    public void changeBox(Potato potato) {
        potato.getBox().potatoes.remove(potato);
        potato.setBox(this);
    }
    ...
}


public class Potato {

    private Box box;

    protected void setBox(Box box) {
        this.box = box;
    }

    public Box getBox(){
        return box;
    }
    ...
}


// This should do the change of box
Potato potato = oldBox.getTopPotato();
newBox.changeBox(potato);

Grazie !!

    
posta jpadilladev 07.02.2018 - 13:10
fonte

1 risposta

3

La patata non ha bisogno di sapere a quale scatola appartiene. La scatola stessa è responsabile della gestione delle proprie patate. Puoi avere una classe di servizio di dominio che può orchestrare la mossa. Questo è buono come una transazione bancaria in cui si stanno spostando i soldi da un account all'altro.

 public class Box {        
        private List<Potato> potatoes;

        public void AddPotato(Potato potato) {
            potatoes.Add(potato);
        }

        public Potato GetTopPotato() {
            var potato = potatoes.First();
            potatoes.Remove(potato);
            return potato;
        } 
    }


    public class Potato {

    }

    public class PotatoMovingService {
       // You can have a method with source and destination box as input, but here I am just writing pseudo-code
       ...    

       var boxA = new Box();
       // Fill boxA with some potatos

       var boxB = new Box();

       var potato = boxA.GetTopPotato();
       boxB.AddPotato(potato);

       ...
    }
    
risposta data 07.02.2018 - 18:39
fonte

Leggi altre domande sui tag