2012-06-28 4 views
10

В полном приложении Java EE, кластеризованном, шаблон DTO по-прежнему является допустимым вариантом? В рассматриваемом приложении используются Спящий режим EJB и Struts с пружиной и т. Д. Есть ли что-то не так с переносом объектов домена в таком сценарии?Является ли шаблон DTO устаревшим или нет?

EDIT: Чтобы уточнить мой вопрос, с современными ресурсами дня и улучшениями в Java EE существует ли причина не просто использовать объекты домена? Если это не так, то тип DTO не исчезает и не должен использоваться в новых приложениях?

ответ

19

Не устарели. Это зависит от архитектуры приложения, если использовать шаблон DTO или нет. Например, при разработке веб-служб (с использованием JAX-WS или JAX-RS) вы должны отправить DTO поверх своих веб-методов, чтобы клиентское приложение C# или Python могло его использовать, и ваш веб-метод не должен возвращать объект, класс которого Hibernate аннотации, помните, чем на других языках Entity не будет создан с этими аннотациями или другой бизнес-логикой внутри.


EDIT (Основано на ваших комментариях): Это зависит от архитектуры программного обеспечения. Например, я работаю над проектом SOA, и мы используем DTO для уровня обслуживания и уровня презентации. Чем глубже внутри, мы даже используем DTO для обработки связи с базой данных внутри сервисов, мы используем только SP для связи с БД, поэтому никакие Hibernate или любые другие инструменты ORM не могут там работать, мы могли бы использовать Spring DAO, и эта среда также использует DTO. Во многих приложениях вы можете найти множество шаблонов DTO.

Более подробная информация, что было бы здорово на этот вопрос:

EDIT 2: Еще один источник информации, который объяснит главную причину для использования дизайн DTO, в объяснена Martin Fowler

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

+0

Да, в таком сценарии я понимаю использование DTO. Вы отправляете результаты в DTO. Но для внутреннего применения использование DTO не очень полезно? – Thihara

+0

Ответ @Thihara отредактирован на основе вашего комментария –

+0

Согласно вашему первому, это анти-шаблон, используемый для того, чтобы обойти тот факт, что сущности beans не были сериализуемыми. С ORM основная проблема не существует. – Thihara

1

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

Минус в приведенном выше подходе состоит в том, что у вас могут быть две параллельные диаграммы классов: одна для DTO и одна для объектов значений (которые используются клиентами), - но во многих случаях в дизайне есть торгово- выкл.
Вы должны понимать преимущества и недостатки и выбирать то, что лучше для вас (в нашем случае, поскольку клиентская сторона - это GWT, нам будет проще перейти на разделение на две иерархии классов: на стороне DTO/server и может быть также аннотирован с большей аннотацией на стороне сервера, а другой - клиентом кода GWT).

+0

Передняя часть не GWT, где я подразумеваю это? Это JSP с большим количеством javascript и jQuery. Да, что я спрашиваю, есть ли смысл использовать их, поскольку современные объектные модели - это то, что держит данные. – Thihara

2

Это очень полезный образец в Java EE.

Я использую DTO для переноса связанных объектов объекта из EJB beans на слой пользовательского интерфейса. Объекты сущности извлекаются из БД за одну транзакцию (см. TransactionAttributeType.REQUIRED) и хранятся в объекте DTO. DTO потреблял в слое пользовательского интерфейса.