DTO или объект доменной модели на уровне представления?

Я знаю, что это, вероятно, извечный вопрос, но что лучше? Использование объекта модели предметной области на всех уровнях вашего приложения и даже привязка значений непосредственно к ним в JSP (я использую JSF). Или преобразуйте объект модели домена в DTO на уровне DAO или Service и отправьте облегченный DTO на уровень представления.

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

Я должен отметить, что мое приложение использует объекты модели Hibernate И использует свои собственные объекты модели, созданные пользователем (то есть не привязанный к какому-либо сеансу БД, всегда отключенный). Является ли какой-либо из приведенных выше сценариев более полезным для строгого шаблона объекта модели? Использование Hibernate было огромной PITA в отношении таких вещей, как Lazy Initialization Exception.

Я редактирую этот вопрос в надежде на продолжение обсуждения (не уверен, правильно ли я это делаю):

Проблема, с которой я сталкиваюсь с модельными объектами, заключается в том, что они вообще не являются гибкими. Комментарий ниже говорит о том, что приложение должно быть спроектировано так, чтобы объекты модели могли использоваться на всех уровнях. Зачем? Если пользователю нужна часть нелепой функциональности, я должен сказать им: «Ну, это не будет работать с модельными объектами»?

Просто и просто, бывают моменты, когда объекты модели не будут работать. Ты можешь иметь:

public class Teacher {
    List<Student> students;
    [tons of other Teacher-related fields]
}
public class Student {
    double gpa;
   [tons of other Student-related fields]
}

но, возможно, вам не нужна вся эта информация. Вам просто нужны фамилия учителя, количество учеников, которых они обучают в этом году, и средний средний балл для всех учеников вместе взятых. Что бы вы сделали в этом случае? Получите полную информацию об учителе и взаимоотношениях со студентами, а затем ваш код получит счет в Списке студентов, а затем вычислит общее среднее значение всех gpas внутри? Это похоже на большие усилия, чем просто создание DTO с 'String lastName', 'int numStudents' и 'double комбинированный Gpa;

Может показаться, что мое мнение об этом решено, но мне еще предстоит поработать в приложении, где объекты модели могут быть полностью использованы чисто в каждом случае. Обычные реальные приложения с необычными требованиями пользователей просто не работают таким образом.

Ответы на вопрос(8)

Ваш ответ на вопрос