Что плохого в том, что агрегат выставляет VO своего состояния, передает его в хранилище и позволяет репо делать сохранение на его основе?
Этот подход нарушает некоторые другие предположения идеи моделирования предметной области.
Одно из таких предположений заключается в том, что ключевая бизнес-логика и «сантехника» должны быть отделены друг от друга. Тот факт, что вам нужно получить сериализуемое представление агрегата, является случайностью того факта, что вы пытаетесь записать состояние в стабильное хранилище (этот шаг был бы совершенно ненужным, если бы вы хранили агрегат в кэше в памяти).
Второе предположение заключается в том, что использование «объектов» для моделирования домена - хорошая идея. Если бы вы использовали функциональный подход, то, конечно, вы бы сохраняли значения, а не объекты.
Мне кажется, это помогает помнить, что контекст решений, которые мы пишем, сильно изменился за последние 15-20 лет. Шаблоны, которые имеют смысл для локализованного приложения с длинными сеансами, включающими много взаимодействий, не обязательно имеют смысл для распределенных приложений без сохранения состояния, и наоборот.
этот паттерн заставляет вас жертвовать совокупной инкапсуляцией
Нет, это не так - запрос объекта для копии некоторой информации в ранее согласованном представлении не нарушает инкапсуляцию. См., Например, Кевлин Хенни .
Однако для этого требуются интерфейсы, подходящие для двух разных соавторов: ваших приложений, которые заботятся о бизнес-правилах, и вашего хранилища, которое заботится о сохранении представлений.