#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). Так что с этой логикой это действительно имеет смысл