Может ли сводный корень изменить «корень» объекта?

У меня есть некоторые сомнения с Agreggate Roots и работа с Entities.

Представьте, что у нас есть объект Box, который содержит картофель. В этом случае и с точки зрения DDD, Aggregate Root будет объектом Box, поэтому, если мы хотим добавить Potatoes в Box, мы должны сделать это через объект box.

Теперь представьте, что мы должны изменить один конкретный картофель на другой ящик. Это, у нас есть Box A (с картофелем A) и Box B. Мы хотим переместить картофель A в коробку B.

Моя первая идея - создать метод внутри объекта Box, который изменит корень «Картофель» (потому что мы не можем сделать это из самого картофеля). Вся логика находится в корневом объекте, поэтому для меня это выглядит хорошо.

Это хороший подход, чтобы сделать это таким образом? Или в случае, если задействованы два элементарных агрегатов (одного типа), мы должны создать службу вместо этого?

Некоторый код

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);

Спасибо!

3 голоса | спросил jpadilladev 7 FebruaryEurope/MoscowbWed, 07 Feb 2018 15:10:48 +0300000000pmWed, 07 Feb 2018 15:10:48 +030018 2018, 15:10:48

1 ответ


3

Картофель не должен знать, в какой коробке он принадлежит. Ящик сам несет ответственность за управление собственным картофелем. У вас может быть класс службы домена, который может управлять ходом. Это так же хорошо, как банковская транзакция, в которой вы перемещаете деньги с одной учетной записи на другую.

 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);

       ...
    }
ответил Alpesh 7 FebruaryEurope/MoscowbWed, 07 Feb 2018 20:39:10 +0300000000pmWed, 07 Feb 2018 20:39:10 +030018 2018, 20:39:10

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132