Sé que esta es probablemente una pregunta ancestral, pero ¿cuál es la mejor práctica? Usar un objeto de modelo de dominio en todas las capas de su aplicación, e incluso valores de enlace directamente a ellos en el JSP (estoy usando JSF). O convierta un objeto de modelo de dominio en un DTO en la capa DAO o Servicio y envíe un DTO liviano a la capa de presentación.DTO u objeto de modelo de dominio en la capa de vista?
Me han dicho que no tiene sentido utilizar DTO porque los cambios en la base de datos darán lugar a cambios en todos sus DTO, mientras que el uso de objetos modelo en todas partes solo requerirá cambios en el objeto modelo afectado. Sin embargo, la facilidad de uso y la naturaleza liviana de los DTO parecen superar eso.
Debo notar que mi aplicación utiliza objetos de modelo de Hibernate Y usa sus propios objetos de modelo creados a medida (lo que significa que no están vinculados a ninguna sesión de base de datos, siempre separados). ¿Alguno de los escenarios anteriores es más beneficioso para un patrón de Objeto de Modelo estricto? El uso de Hibernate ha sido un gran PITA en lo que respecta a cosas como excepciones de inicialización diferida.
estoy editando esta pregunta con la esperanza de promover la discusión (no estoy seguro si estoy haciendo este derecho):
El problema que tengo con los objetos del modelo es que no son flexibles en absoluto. Un comentario a continuación dice que la aplicación debe diseñarse de modo que los objetos modelo se puedan usar en todas las capas. ¿Por qué? Si un usuario quiere una pieza de funcionalidad ridícula, ¿se supone que debo decirles 'bueno, eso no funcionará con objetos modelo'?
Simple y llanamente, hay ocasiones en que los objetos del modelo no funcionarán. Puede tener:
public class Teacher {
List<Student> students;
[tons of other Teacher-related fields]
}
public class Student {
double gpa;
[tons of other Student-related fields]
}
pero tal vez no necesite toda esa información. Solo necesita el apellido del maestro, la cantidad de alumnos que enseña este año y el promedio general de todos los alumnos combinados. ¿Qué harías en ese caso? Recupere la información completa del docente y las relaciones de los alumnos, y luego su código obtiene un recuento de la Lista de alumnos, y luego calcula el promedio total de todos los gpas. Parece mucho más esfuerzo que simplemente crear un DTO con 'String lastName', 'int numStudents' y 'double combinedGpa;
Puede parecer que he pensado en esto, pero todavía tengo que trabajar en una aplicación en la que los objetos modelo se puedan utilizar completamente y sin problemas en cada instancia. Las aplicaciones habituales en el mundo real con demandas de usuarios fuera de lo común simplemente no funcionan de esa manera.
Sí, lo entiendo. Simplemente parece que agrega complejidad innecesaria a veces. Si tengo un objeto que dice que representa a un Profesor y a veces solo necesito la información del encabezado (nombre, dirección), tengo que enviar un objeto de dominio medio poblado al front-end. Es simplemente un poco engañoso y no me parece correcto. – sma
@ smayers81: ¿por qué solo llenas tus objetos de dominio a mitad de camino? Suena como una optimización innecesaria (no si usted ha perfilado o ha descubierto un problema por supuesto). Eso suena como la raíz de su problema: tratar sus objetos de dominio como DTO. ¿Por qué no simplemente empujar sus objetos de dominio totalmente hidratados a la parte delantera? Si descubre que tiene un problema de rendimiento, entonces tiene un caso para DTO (o para eludir por completo los objetos personalizados y trabajar directamente con la abstracción de conjunto de registros que proporciona su marco). –
Porque siempre lo sentí, ¿por qué enviar todos esos datos por el cable si no es realmente necesario? Creo que fue todo el ímpetu detrás de la idea de Hibernate de la recolección diferida (podría estar equivocado) – sma