Пейджинг между несколькими совокупными корнями

Я новичок в DDD, поэтому, пожалуйста, казните меня, если какой-то термин / понимание откусили. Но, пожалуйста, поправьте меня, и мы будем благодарны за любые советы.

Допустим, я создаю сайт социальной доски объявлений и определила свои общие корни: кандидаты, вакансии и компании. Очень разные вещи / контексты, поэтому у каждого есть собственная таблица базы данных, репозиторий и сервис. Но теперь мне нужно создать домашнюю страницу в стиле Pinterest, где блоки данных отображают данные либо о кандидате, либо о вакансии, либо о компании.

Теперь сложная часть состоит в том, что блоки данных должны быть упорядочены по тому моменту, когда в последний раз что-то произошло с агрегатом, который он представляет (компания понравилась / прокомментирована, или задание было обновлено, и т. Д.), И разбиение по страницам происходит в форме бесконечной прокрутки, снова точно так же, как Pinterest. Поскольку с этими агрегатами все происходит независимо, у меня нет способа узнать, сколько агрегатов находится на какой-либо конкретной странице. (но если бы я сделал, кстати, таблицу, которая отслеживает время последнего обновления агрегатов, у меня нет другого выбора, кроме как продвинуть это как еще один агрегированный корень с собственным репозиторием?)

Где мне реализовать логику разбиения по страницам? Я где-то читал, что должна быть одна служба на репозиторий для каждого совокупного корня, поэтому мне следует сортировать и подстраивать страницы в контроллере (кстати, я использую MVC)? Или должна существовать независимая служба приложений, которая выполняет подобные вещи, пересекающие границы? В любом случае мне нужно получить ВСЕ объекты для ВСЕХ агрегатов из базы данных?

Это уже слишком много вопросов, но я в основном спрашиваю:

  1. Что такое постраничная презентация, бизнес-логика или постоянная логика? Какой горизонтальный слой?
  2. Где должен находиться код пересечения границ в DDD? Какой вертикальный стек?

person Jeff Huang    schedule 28.04.2012    source источник


Ответы (1)


На ум приходит несколько вещей.

  • Насколько свежими должны быть эти агрегированные данные? Я сомневаюсь, что реальное время принесет большую пользу. Поговорите с деловым человеком и поторгуйтесь за некоторую задержку. Это позволит вам найти более простое решение проблемы.
  • Почему бы не сделать так, чтобы какой-то процесс выполнял сканирование, агрегирование, сортировку и не сохранял результат асинхронно? Даже не обязательно быть в базе данных (Redis). Согласованная задержка может быть интервалом, с которым запускается ваш процесс.
  • В вашем примере пейджинг вряд ли является проблемой для бизнес-решения. Вам просто нужно обеспечить бесконечную прокрутку и несколько вызовов ajax, которые извлекают кэшированную, агрегированную, отсортированную информацию. Это не имеет ничего общего с DDD.
  • Ваши артефакты пользовательского интерфейса и агрегация, процесс сортировки кажутся очень самостоятельными, работая вместе с данными или, что еще лучше, компонентом данных каждого контекста, который предоставляет данные в желаемом формате.
person Yves Reynhout    schedule 29.04.2012