Как удалить объект Value в объекте Value [DDD]

#c# #domain-driven-design

#c# #дизайн, управляемый доменом

Вопрос:

У меня есть вопрос относительно DDD. Как мне удалить VO в VO? Итак, у меня есть совокупный x с VO y. В VO y есть список VO z. зЛистВО

Теперь я хочу удалить zVO из агрегата.

Могу ли я сделать: (метод на прикладном уровне)

 public void main 
{
  y.remove(zVO z)
}
  

АГРЕГИРОВАТЬ X

 private void Handle(RemovedZDE z)
{
    this.x.remove(z.z);
}
  

А затем создать метод в VO Y, в котором я удаляю z из их списка VO?

Класс yVO

 protected void Remove(zVO z)
{
  zListVO.remove(z);
}
  

Ответ №1:

Как правило, экземпляры шаблона объекта value неизменяемы; обычно у вас нет команд (в смысле CQS), только запросы.

Поэтому чаще можно увидеть что-то вроде

 new_y = old_y.remove(z)
  

У меня есть совокупный x с VO y. В VO y есть список VO z. зЛистВО

Основная идея будет выглядеть так:

 X::remove(Z z) {
   old_y = this.y
   new_y = old_y.remove(z)

   // X is an entity, so we normally update its state directly
   this.y = new_y
}

Y::remove(Z z) {
    old_list = y.zListVO
    new_list = old_list.remove(z)
    // Y is a value, so we create a new value to describe
    // the change
    return new Y(new_list)
}
  

Комментарии:

1. Таким образом, объект value всегда следует удалять и добавлять снова, даже если изменяется только объект Value внутри (x -> y -> z). Так что с этой логикой это действительно имеет смысл