Легкие агрегаты и репозитории

Предположим, что у нас есть два простых объекта предметной области: Тема (сущность) -> Сообщения (объект значения)

Эти два предметных объекта могут быть включены в один агрегат в соответствии с принципами DDD.

Но в некоторых случаях нам нужно получить темы без сообщений (если вы хотите просто показать список тем), а иногда нам нужно получить темы с сообщениями.

Как лучше всего спроектировать этот простой корпус? Заранее спасибо.


person Stephen L.    schedule 22.03.2014    source источник


Ответы (1)


Я бы посоветовал вам отделить логику предметной области от данных, необходимых для представления. Что-то вроде разделения команд и запросов (CQS) или разделения ответственности команд и запросов (CQRS). Например, если кто-то добавляет новое сообщение в тему, вы создаете соответствующую команду и обрабатываете ее как часть логики вашего домена. И если вам нужно отобразить какие-то данные в пользовательском интерфейсе, вы выбираете только те данные, которые вам действительно нужны через DTO (объект передачи данных). Это решение позволяет избежать ненужного извлечения данных и помогает сохранить простоту. Вы получаете только те данные, которые вам действительно нужны.

Если это решение вызывает много изменений в вашем проекте, вы можете создать дополнительный метод в репозитории, который возвращает облегченную версию вашего агрегата (с заглушкой по умолчанию для коллекции сообщений). Но у этого решения есть один недостаток — вам нужно будет иметь в виду, что этот метод возвращает неполные данные.

person eternity    schedule 24.03.2014
comment
Второй вариант с «облегченным» агрегатом мне понятен, но мне не нравятся подходы типа «имей в виду», потому что они склонны к ошибкам. Я изучаю CQS/CQRS прямо сейчас. Выглядит нормально, за исключением того, что дата должна быть продублирована. Если тема и сообщение довольно большие (содержат много полей), то я должен включить эти поля в свой DTO. Проще говоря, тогда мне придется поддерживать еще один дополнительный контейнер данных... - person Stephen L.; 25.03.2014