DTO сервисного уровня - большие сложные интерактивные объекты, подобные отчетам
У меня есть объекты Meeting, которые составляют основу системы планирования, из которых gridviews используются для отображения важной информации. Это делается для того, чтобы планировать сотрудников на собрания, и чтобы сотрудники могли видеть, что было запланировано.
Я пытался следовать принципам DDD, но мне трудно понять, что перейти от моего уровня обслуживания к области представления системы. Это связано с тем, что расписание может быть БОЛЬШИМ и фактически состоит из множества различных элементов системы. Например. Имя клиента, адрес, информация о деле, группа и т. Д., Все это необходимо для принятия решения планировщиком собрания.
В дополнение к этому планировщик должен изменить значения в этом расписании и передать его обратно на уровень обслуживания (например, назначить сотрудников из выпадающих списков, возможно, изменить группу и т. Д.). Таким образом, информация на самом деле не "только для чтения" - с ней нужно взаимодействовать. то есть. Это не просто отчет.
Наш текущий подход заключается в заполнении сплющенного "объекта расписания" из SQL, который состоит из небольших частей различных доменных объектов. Это довольно сложный запрос. Когда изменения внесены, они затем передаются обратно на уровень сервиса, и служба извлекает рассматриваемые доменные объекты и запускает бизнес-методы для доменных объектов, используя информацию из DTO.
Мой вопрос, это правильный подход? то есть. Продолжать генерировать большие пользовательские объекты из SQL, а затем переходить от уровня обслуживания к объектам уровня представления, которые очень похожи на модели представления?
ОБНОВЛЕНИЕ из-за ответа
Чтобы дать представление о количестве взаимосвязей сущностей / агрегатов. (это запутанные примеры, поэтому здесь важны отношения)
Клиент находится в одной группе по умолчанию
У клиента есть один открытый случай, но много закрытых
Случаи имеют много встреч
Встреча имеет много назначенных сотрудников
У встречи много причин
Встреча может быть запланирована для разных групп
Сотрудники могут быть связаны со многими группами.
Расписание должно загружать все собрания в открытых случаях, которые принадлежат пациентам, которые находятся в той же группе, что и сотрудник.
Планировщик может видеть имя клиента, адрес клиента, информацию о деле, MeetingTime, MeetingType, MeetingReasons, запланированные группы (showstrail), назначенных сотрудников (также есть скрытые идентификаторы сотрудников).
Редактируемые поля - это назначенные выпадающие списки сотрудников и запланированная группа.
- Расписание может быть до двухсот строк.
- DTO происходит от WCF, поэтому модель домена доступна выше уровня сервиса, а не ниже.
- Бизнес-вызовы модели предметной области, использующиеся сервисом, основаны на значениях DTO, передаваемых обратно, а репозитории работают со вставками / обновлениями.
Итак, я полагаю, для обновления, используется ли запрос для заполнения объекта, который содержит все вышеперечисленное, приемлемо для передачи в виде одного объединенного DTO? А если нет, как бы вы подошли к этому? (приведем несколько примеров обращений к уровню обслуживания и объясним немного о том, как вы представляете себе ORM, извлекающий данные с учетом производительности)
1 ответ
На уровне сервиса и ниже я бы рассматривал каждую сущность (см. Корни агрегатов в DDD) отдельно в отношении ее транзакционной границы. Т.е. даже если бы вы могли обновить клиент и случай в одном и том же представлении пользовательского интерфейса, было бы лучше изменить клиентом транзакцию, а затем изменить случай. Чем больше вы пытаетесь изменить в одной транзакции, тем больше вы можете конфликтовать с другими пользователями.
Несмотря на то, что ваш график большой и может содержать много объектов, сервисный уровень должен снова иметь дело с каждой сущностью (совокупным корнем) отдельно, а затем связать их вместе в новую модель представления. К сожалению, в проектах "коричневого поля" в SQL может быть много логики, а массивные объединения с несколькими таблицами затрудняют рефакторинг в более атомарные запросы, выполняющие именно то, что нужно. Старо-школьное ориентированное на данные представление "делай все, что можно в базе данных" идет вразрез со всем DDD.
Поскольку DDD представляет собой набор дизайнерских идей и шаблонов, а не методологию или архитектуру, может показаться, что уже слишком поздно пытаться использовать текущее приложение в дизайне, ориентированном на приложения DDD. Звучит так, как будто ваше текущее приложение очень укоренилось в ориентированном на данные виде.
Если в настоящее время все данные пропускаются через слои в одном монолитном фрагменте, возможно, лучше придерживаться этого стиля и просто предоставлять эти монолитные фрагменты людям из другой команды, которые хотят их использовать, для использования в их новом приложении. Возможно, вам удастся установить на место какое-то кэширование модели представления (немного похоже на элемент модели кэширования представления в CQRS).
По моему личному мнению, у ориентированных на данные нормализованных приложений данных был свой день (они имели смысл в 1970-х годах, когда место на жестком диске было дорого), и все приложения должны переходить на более современные методы. В действительности, только когда устаревшие системы ползут на коленях, заинтересованные стороны обычно вкладывают деньги в поиск альтернатив (обычно после заполнения каждого последнего сервера оперативной памятью). Возможно, было бы лучше или лучше убедить их в необходимости рефакторинга небольших разделов за раз.