2009-07-06 3 views
12

Хотя очевидно, что не все сценарии могут быть охвачены одним дизайном, обычно считается, что классы ORM должны передаваться между презентационным и бизнес-уровнем (как локальные, так и бизнес-уровни) удаленный), заменив необходимость в объектах передачи данных? Насколько я вижу, использование классов ORM представляет проблемы ненужной нетерпеливой загрузки, проблем управления контекстом и жесткой связи, но также экономит много времени и упрощает простую работу. Существует ли теперь стандартный подход, который в целом поддерживает один над другим (для большинства ситуаций)?Использует объекты передачи данных в ejb3 считается лучшей практикой

ответ

4

Это очень интересный вопрос, и я изучал и экспериментировал с переходом через два года.

Я думаю, что здесь нет правильного или неправильного ответа. Я не думаю, что вы можете просто сказать, что я хочу один за другим, потому что обычно вам может понадобиться гибрид в зависимости от того, что ваши клиенты (веб-страница, ws, машина и/или локальный, удаленный).

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

Для примера:

  • Если вы используете шовные, то вы хотите, чтобы избежать сильно многоуровневую архитектуру, потому что у вас есть доступ к расширенному контексте сохранения состояния. Другие веб-технологии без этой поддержки, как правило, работают лучше с DTO, который подготовил государство заранее.
  • Если вы отправляете удаленное сообщение, задача импорта заключается в том, чтобы сохранить его тонким и легким, DTO, как правило, работает лучше, чем богатый объект домена. Здесь вы можете подавлять прозрачно любые проблемы/поведение ORM.
  • Шаблон DTO имеет преимущество защиты ваших клиентов от изменений в домене. Это особенно важно, если ваше приложение является веб-сервисом, имеющим объект домена (сущность), который определяет ваш контракт, который может оставить вас в какой-то момент.

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

1

Я думаю, что существование DTO связано с JPA/Hibernate недостатки. Если вы всегда можете делать прозрачную ленивую инициализацию, вы никогда не будете использовать их. Таким образом, использование DTO - это контракт, где мой домен/рабочее пространство всегда проигрывает (дублирование везде). Подводя итоги, вы можете использовать их, но вы должны их ненавидеть :)

2

Плотная муфта? Пожалуйста, объясни.

Что касается меня DTO - это анти-шаблон. EJB3 позволяет нам использовать их. Вы можете просто заставить свою ленивую инициализацию перед отправкой Entity клиенту.

Конечно, если вам нужно только два из 30 полей для отправки клиенту, вы просто отправляете их. Но если все копии все время, как в моем текущем проекте, попытайтесь избавиться от этого DTO. Я не вижу причин использовать их. Вы отправляете бизнес-объект клиенту в качестве клиента. Зачем использовать обертку?

0

Я согласен с последним «динамиком», почему использовать обертку, когда в ejb3 ?? Мы строим довольно сложную систему без DTO, но используя Entities (JPA), она сработала. Было ясно ...

0

, работающий только с объектами, был бы прекрасен, если контроллер GUI отправляет свойства объекта формам, а не объектам сущности.С другой стороны, если сущности используются, и эти сущности имеют отношения «один-к-одному», тогда следует ожидать появления некоторых неприятных исключений, если сущности не будут охотно загружены менеджером сущности.

Такие ситуации можно наблюдать при попытке заполнить теги Spring MVC, например, или аналогичные конструкции других компонентов GUI.

Кроме того, DTOS являются очень хорошим местом для размещения дополнительных аннотаций, таких как аннотация проверки или JAXB и т.д.

1

У меня есть несколько вопросов, против использования объектов на уровне представления:

  • Блокировочных: Это в конечном итоге создает жесткую блокировку между презентацией и моделью. Из-за дорогостоящих изменений в больших проектах даже невозможно. Современные инструменты еще не совсем там.

  • Безопасность: С объектами модели вы легко передаете различные данные идентификатора базы данных на свои веб-страницы. Это явная проблема безопасности. Используя dto:s, вы можете скрыть на сервере с очень простыми картами сеансов.

  • Разница потребностей: Графические представления редко представляют собой списки объектов модели. Чаще всего это нечто большее, объединенные звери, guish. Потребности GUI, как правило, ползут к вашей модели, скрывающей ее.

  • : С сущностями каждое поле обрабатывается каждый раз, когда вы читаете/записываете их. Поскольку вы передаете их непосредственно на презентационный уровень, вам трудно попытаться оптимизировать ваши JPA-запросы - почти невозможно. Я определенно вернусь к прямому JDBC -access - как myBatis в будущих проектах. Таким образом, исключается ORM.

У меня есть проблемы с DTO:s тоже:

  • дополнительный код DAO.

Все, что касается, я проголосую за использование dto:s для всех проектов, исключая также JPA. Итак, мой стек становится чем-то вроде:

  • myBatis для доступа к базе данных
  • POJO в DTO: S
  • Stateless EJB для моих DAO услуг.
  • StatefulEJB для бэкэнда GUI.
  • JSF для представления.
Смежные вопросы