Как совокупный корень удаляет одного из своих дочерних элементов?

Если мое понимание Aggregate Roots верное, корень также должен нести ответственность за удаление одного из своих «потомков». Казалось бы, это можно перевести примерно так:

order.removeOrderLine(23);

Что бы эффективно удалить его из коллекции. Однако как это сохраняется? Должен ли UnitOfWork моего ORM обнаруживать, что что-то пропало в этой коллекции, а затем удалять это из базы данных?

Должен ли я вместо этого использовать метод removeOrderLine для OrderRepository?


person blockhead    schedule 12.11.2009    source источник


Ответы (1)


Обычно об этом должна заботиться ваша единица работы, но это зависит от ее реализации, особенно от того, как она обнаруживает изменения. Некоторые реализации единиц работы (например, Hibernate) хранят копию агрегата до того, как вы его изменили, поэтому в конце бизнес-транзакции (когда вы вызываете что-то вроде unitOfWork.PersistAll()) он пытается сопоставить текущую версию всех объектов ( и коллекции) по сравнению с оригинальной версией.

Другой способ состоит в том, чтобы объекты вашего домена были более связаны с вашей единицей работы, чтобы сущность уведомляла единицу работы, когда что-то меняется (т.е. метод order.removeOrderLine уведомлял единицу работы об изменении).

Существует несколько способов реализации обнаружения изменений UoW. Взгляните на несколько реализаций hibernat для вдохновения.

person Tomas    schedule 12.11.2009
comment
Что касается отслеживания изменений коллекции, у меня есть хороший опыт простой реализации пользовательской коллекции, которая фиксирует все вызовы методов добавления и удаления и сохраняет добавленные/удаленные объекты в 2 внутренних коллекциях — 1 коллекция для добавленных элементов, 1 коллекция для удаленных элементов. Затем UoW может просто спросить у коллекции, что изменилось. - person Tomas; 13.11.2009