DTO сервисного уровня — большие сложные интерактивные объекты, похожие на отчеты

У меня есть объекты Meeting, которые составляют основу системы планирования, в которой gridviews используются для отображения важной информации. Это делается для планирования совещаний сотрудников и для просмотра сотрудниками того, что было запланировано.

Я пытался следовать принципам DDD, но у меня возникли трудности с пониманием того, что нужно передать с моего сервисного уровня в область представления системы. Это связано с тем, что расписание может быть БОЛЬШИМ и на самом деле состоит из множества различных элементов системы. Например. Имя клиента, адрес, информация о деле, группа и т. д. — все это необходимо планировщику собрания для принятия решения.

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

Наш текущий подход заключается в заполнении плоского «Объекта расписания» из SQL, который состоит из небольших частей различных объектов предметной области. Это довольно сложный запрос. Когда изменения были внесены, они затем передаются обратно на уровень службы, и служба извлекает рассматриваемые объекты домена и запускает бизнес-методы для объектов домена, используя информацию из DTO.

У меня вопрос, это правильный подход? т.е. Продолжать генерировать большие настраиваемые объекты из SQL, а затем передавать из сервисного уровня в объекты уровня представления, которые очень похожи на модели представления?

ОБНОВЛЕНИЕ в связи с ответом

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

  • Клиент находится в одной группе по умолчанию

  • У клиента есть одно открытое дело, но много закрытых

  • Дела имеют много встреч

  • Совещание имеет много назначенных сотрудников

  • Встреча имеет много причин

  • Встреча может быть запланирована для разных групп

  • Сотрудники могут быть связаны со многими группами.

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

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

Редактируемые поля назначают раскрывающиеся списки сотрудников и запланированные группы.

  • Расписание может быть до двухсот строк.
  • DTO происходит от WCF, поэтому доступ к модели домена осуществляется выше этого уровня службы, а не ниже.
  • Бизнес-вызовы модели предметной области, используемые службой на основе переданных значений DTO, а репозитории обрабатывают вставки/обновления.

Итак, я полагаю, чтобы обновить, использует ли запрос для заполнения объекта, который содержит все вышеперечисленное, приемлемо для передачи в качестве одного объединенного DTO? А если нет, то как бы вы к этому подошли? (приведите несколько примеров вызовов сервисного уровня и немного объясните, как вы понимаете, как ORM извлекает данные с учетом производительности)


person Milambardo    schedule 06.02.2014    source источник
comment
Этот вопрос охватывает слишком много, вам лучше задать один вопрос и сократить содержание как минимум до четверти. Я бы пока забыл о DDD и SOA, то, что вы описали выше, не является DDD или SOA. Ваше решение по предоставлению прикладного уровня через веб-службы (в частности, WCF) имеет много побочных эффектов, если вы идете по этому пути, то я бы разработал решение, которое работает (по крайней мере, временно) и забыть обо всем аббревиатуры. Задумывались ли вы о создании адаптивного веб-сайта вместо этого? Это даст вам решение, которое работает на настольных компьютерах, мобильных телефонах и планшетах.   -  person Adrian Thompson Phillips    schedule 07.02.2014
comment
Привет, у нас уже есть веб-сайт, который работает на всех устройствах. Было принято решение воспользоваться нативным интерфейсом на мобильных устройствах (это не мое решение), и, поскольку это будет другая команда, мы предоставляем сервисный слой.   -  person Milambardo    schedule 07.02.2014
comment
Также - я отредактирую вопрос.   -  person Milambardo    schedule 07.02.2014


Ответы (1)


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

Несмотря на то, что ваше расписание большое и может содержать множество объектов, сервисный уровень должен снова обрабатывать каждую сущность (совокупный корень) отдельно, а затем объединять их вместе в новую модель представления. К сожалению, в старых проектах большая часть логики может быть в SQL, а массивные объединения нескольких таблиц могут затруднить рефакторинг в более атомарные запросы, которые делают именно то, что нужно. Старомодный ориентированный на данные взгляд «делай все, что можешь в базе данных» идет вразрез со всем DDD.

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

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

По моему личному мнению, приложения, ориентированные на данные, с нормализованными данными, отжили свой день (они имели смысл в 1970-х годах, когда место на жестком диске было дорогим), и все приложения должны двигаться в сторону более современных методов. На самом деле, только когда устаревшие системы ползают на коленях, заинтересованные стороны обычно вкладывают деньги в поиск альтернатив (обычно после того, как каждый сервер заполнен оперативной памятью). Было бы возможно или лучше всего убедить их рефакторить небольшие разделы за раз.

person Adrian Thompson Phillips    schedule 07.02.2014
comment
Не все передается большими кусками, только расписания из-за большого количества отношений между сущностями/агрегатами (клиенты, дела, команды, команды сотрудников) и количество коллекций в объектах собраний (назначенные, причины встречи, запланированные группы и т. д.). Если у меня есть расписание длиной, скажем, 200, возникнет проблема с производительностью, если я буду лениво загружать через Nhibernate. - person Milambardo; 07.02.2014
comment
Чтобы было немного понятнее, информация о клиенте и случае помогает планировщику. DTO, переданный обратно, повлияет только на совокупность собраний, поскольку он извлекается из БД, а его бизнес-методы называются предоставлением значений, извлеченных из значений DTO. Таким образом, обновления по-прежнему являются транзакционными. - person Milambardo; 07.02.2014