Подтвердить что ты не робот

Как обрабатывается управление доменами?

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

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

Для таких функций вполне естественно, что мы можем выполнять объединение в SQL (или любой язык запросов), получать интересующие столбцы и возвращать массированный набор результатов. Однако, похоже, такой способ не так хорошо работает с DDD: нам нужен дополнительный специальный репозиторий или наличие существующего большинства связанных репозиториев, возвращающих специальный объект "объект/значение" (который является специализированным набором результатов). Такие специальные "сущности" не имеют никакого значения на самом деле.

Если мы хотим использовать значимый уровень домена, это может создать много дополнительных поисковых запросов из разных репозиториев, а также много работы по агрегированию на уровне домена или услуги, что может привести к ухудшению производительности.

Я также подумал о том, что для такого типа функций есть еще один "путь", который не проходит через "путь DDD", имея свой собственный способ получить данные отчета из БД, составлять результаты для отображения. Однако это сделает приложение излишне сложным, и что еще хуже, мы предоставили дополнительный путь, чтобы разработчики, которые больше привыкли к традиционной разработке, ориентированной на БД, могут использовать этот путь, даже если это не подходит.

Я думал, что такая ситуация довольно распространена (обычно большая система не содержит оперативных, а также функций отчетности и запросов), я хотел бы знать, как люди с этим справляются?

4b9b3361

Ответ 1

Недавно мы начали использовать DDD для разработки системы. У меня были те же проблемы, что и у вас, но в конечном итоге устроились на разделение ответственности за запрос команд (CQRS) [Fowler, Young, Dahan]. Хотя для запроса требуется "путь db", я вовсе не чувствую, что возникает соблазн сделать прямо в DB for Commands (те, которые изменяют состояние домена). Разделение очень ясно - команды проходят через домен, запросы идут напрямую к БД.

Ответ 2

С точки зрения DDD Reporting в большинстве случаев это отдельный ограниченный контекст и поддерживающий субдомен, где доменный дизайн будет излишним. Помните наиболее важную концепцию DDD: сосредоточьте свои усилия на моделировании основного домена и реализуйте все остальное, используя самое простое решение.

Ответ 3

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

Я использовал ярлык, чтобы создать представление или хранимую процедуру, чтобы вернуть объединенные данные в простой немой объект.

Ответ 4

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

Обычно репозитории выполняют такие задачи. Я думаю, вы беспокоитесь о том, как эффективно реализовать это, и ответ на этот вопрос - "ленивая загрузка".

Например, давайте возьмем "резюме всех заказов, которые сделал трейдер". "Сводка" - это задача отчетности, поэтому отложите это. Задача домена "найти все заказы для трейдера". У вас может быть такой метод репозитория:

List<Order> findOrdersByTrader(Trader trader);

Вы можете реализовать это, загрузив только минимальную (сводную) информацию для каждого заказа. Если вы затем введете интерфейс репозитория в объект Order, сам объект может вызвать репозиторий для загрузки дополнительных субингументов по мере необходимости.


Обновление: Ваш комментарий делает проблему более ясной - я неправильно понял часть агрегации ранее. Кажется, что "сводка заказов" действительно принадлежит в вашем домене. Иногда не очевидно, что концепция является частью домена, но если это функция, о которой говорят пользователи ( "Я хочу просмотреть сводку заказов, размещенных этим трейдером" ), и нет существующего объекта, который может это сделать, что является признаком скрытой концепции в вашем домене. В конце концов, вам нужен какой-то объект для отслеживания "количества заказов для каждого запаса", и нет причин, по которым этот объект не может быть частью вашего домена.