Я знаю, что это, вероятно, вековой вопрос, но какова лучшая практика? Использование объекта модели домена на всех уровнях вашего приложения и даже привязка значений непосредственно к ним в JSP (я использую JSF). Или преобразовать объект модели домена в DTO на уровне DAO или Service и отправить легкий DTO на уровень представления.Объект модели DTO или домена в представлении?
Мне сказали, что использовать DTO нет смысла, потому что изменения в базе данных приведут к изменениям во всех ваших DTO, тогда как использование объектов модели везде потребует изменений в затронутом объекте модели. Однако простота использования и легкий характер DTO, похоже, перевешивают это.
Следует отметить, что мое приложение использует объекты модели Hibernate и использует свои собственные объекты модели, созданные пользователем (что не связано с какой-либо сессией БД, всегда отделяется). Является ли любой из вышеперечисленных сценариев более полезным для строгой модели объекта модели? Использование Hibernate было огромным PITA в отношении таких вещей, как Lazy Initialization Exceptions.
я редактирую этот вопрос в надежде на дальнейшее обсуждение (не уверен, если я делаю это право):
У меня есть проблема с модельными объектами является то, что они не являются гибкими на всех. В приведенном ниже комментарии говорится, что приложение должно быть спроектировано таким образом, чтобы объекты модели могли использоваться на всех уровнях. Зачем? Если пользователь хочет кусочек смешной функциональности, я должен сказать им: «Хорошо, что не будет работать с объектами модели»?
Обычный и простой, есть моменты, когда объекты модели не будут работать. У вас могут быть:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
, но, возможно, вам не нужна вся эта информация. Вам просто нужна фамилия преподавателя, количество учеников, которых они учат в этом году, и средний показатель GPA для всех студентов. Что бы вы сделали в этом случае? Получите полную информацию о преподавателях и студенческих отношениях, а затем ваш код получает счет в списке учеников, а затем вычисляет общее среднее значение всех gp внутри? Это похоже на waaaay больше усилий, чем просто создание DTO с 'String lastName', 'int numStudents' и 'double combinationGpa;
Может показаться, что мой разум был составлен на них, но мне еще предстоит работать в приложении, где объекты модели могут быть полностью использованы в каждом конкретном случае. Обычные приложения реального мира с необычными требованиями пользователей просто не работают.
Да, я понимаю. Похоже, что иногда добавляет ненужную сложность. Если у меня есть объект, который говорит, представляет собой Учителя, и мне нужны только данные заголовка (имя, адрес), я должен отправить наполовину заполненный объект домена в интерфейс. Это своего рода вводящий в заблуждение и не кажется мне правильным. – sma
@ smayers81 - почему вы только заполняете свои объекты домена на полпути? Это звучит как ненужная оптимизация (не если вы профилировали или иначе открыли проблему, конечно). Это звучит как корень вашей проблемы - обработка ваших доменных объектов, таких как DTO. Почему бы просто не подтолкнуть ваши полностью гидратированные объекты домена к интерфейсу? Если вы обнаружите, что у вас проблема с производительностью, у вас есть случай для DTO (или для обхода пользовательских объектов в целом и прямой работы с любой абстракцией набора записей, предоставляемой вашей инфраструктурой). –
Потому что я всегда чувствовал, зачем отправлять все эти данные по проводам, если это не нужно. Я думаю, что это был весь толчок идее ленивого извлечения Hibernate (я мог ошибаться) – sma