Рассмотрим следующую объектную модель (- >> обозначает коллекцию):
Клиент-> Заказы
Заказы - >> OrderLineItems-> Product {} Цена
Приложение ориентировано на обработку заказов, поэтому в пользовательском интерфейсе используется большая часть расписаний, показывающих все заказы, которые соответствуют определенным критериям. В 99% случаев меня интересует только сумма итогов LineTotals, а не отдельные значения LineTotals.
Если подумать об этом, также может быть несколько платежей (банковские переводы, чеки, кредитные карты и т. Д.), Связанных с каждым заказом, опять же, меня интересует только сумма денег, которую я получил.
При запросе базы данных для заказа я не хочу выбирать все заказы, а затем, для каждого заказа, его платежи и LineItems.
Моя идея заключалась в том, чтобы сохранить привязку каждого заказа к объекту «статус», кэшируя все суммы и статус заказа, улучшая производительность запросов на порядки, а также поддерживая сценарии запросов для неоплаченных заказов, оплаченных заказов, причитающихся заказов и т.д.
Это предотвращает утечку логики домена (например, когда заказ считается оплаченным) в запросы к базе данных. Тем не менее, это возлагает ответственность за поддержание сумм в актуальном состоянии. Система обычно имеет четко определенные точки, где это должно произойти, например, ввод или интеграция платежей, создание / изменение заказа.
До сих пор я использовал Observable Collections, которые запускают пересчеты Status, когда элементы добавляются или удаляются, или обновляются определенные свойства элементов. Я спрашиваю себя, где логика для всего, что должно быть поставлено с точки зрения DDD. Мне кажется странным заставить всю логику обработки событий и вычислений в совокупном корне.