После прочтения некоторых вопросов Q/As здесь, в stackoverflow, я все еще запутался в правильной реализации DTO в моем веб-приложении. Моя текущая реализация - это многоуровневая архитектура на основе Java EE (с персистентностью, сервисом и уровнем представления), но с "общим" пакетом, который используется всеми слоями, содержащими (среди прочих) объекты objecs. В этом случае слои не могут считаться независимыми. Я планирую шаг за шагом удалить общий пакет, но я сталкиваюсь с различными проблемами/вопросами:
- Предположим, что слой persistence будет использовать класс myproject.persistence.domain.UserEntity(объект на основе JPA) для хранения и загрузки данных в/из базы данных. Чтобы показать данные в представлении, я бы предоставил еще один класс myproject.service.domain.User. Где я их конвертирую? Будет ли служба для пользователей отвечать за преобразование между двумя классами? Это действительно поможет улучшить сцепление?
- Как должен выглядеть класс User? Должны ли они содержать только геттеры, чтобы быть неизменяемыми? Разве это не было бы громоздким для взглядов на редактирование существующих пользователей (создание нового пользователя, использование геттеров существующего объекта User и т.д.)?
- Должен ли я использовать те же DTO-классы (Пользователь) для отправки запроса службе для изменения существующего пользователя/создания нового пользователя или для реализации других классов?
- Не будет ли уровень представления сильно зависеть от уровня сервиса, используя все DTO в myproject.service.domain?
- Как обрабатывать мои собственные исключения? Мой текущий подход перескакивает большинство "серьезных" исключений, пока они не обрабатываются уровнем представления (обычно они регистрируются, и пользователю сообщают, что что-то пошло не так). С одной стороны, у меня проблема, что я снова обмениваю общий пакет. С другой стороны, я до сих пор не уверен, что это можно считать "лучшей практикой". Любые идеи?
Спасибо за любые ответы.