Me pregunto porque si es así, ¿por qué Entity Framework no ofrece lógica para crear un nuevo objeto con las mismas propiedades para transferir datos entre capas?
Utilizo los objetos de entidad que genero con el marco de la entidad.
design
design-patterns
architecture
domain-driven-design
entity-framework
usuario2484998
fuente
fuente
Respuestas:
Es tu decision.
La mayoría de la gente le dirá que no es una buena práctica, pero puede salirse con la suya en algunos casos.
EF nunca jugó bien con DDD por múltiples razones, pero dos se destacan: no puede tener constructores parametrizados en sus entidades y no puede encapsular colecciones. DDD se basa en eso, ya que el modelo de dominio debe incluir tanto datos como comportamiento.
En cierto modo, EF te obliga a tener un modelo de dominio anémico y en este caso puedes usar las entidades como DTO. Puede encontrar algunos problemas si usa las propiedades de navegación, pero puede serializar esas entidades y enviarlas por cable. Sin embargo, puede no ser práctico. Deberá controlar la serialización de cada entidad que tenga propiedades que no necesita enviar. La forma más fácil es simplemente diseñar clases separadas adaptadas para la transferencia de datos. Las bibliotecas como AutoMapper se crean para este propósito.
Por ejemplo: suponga que tiene una clase llamada
Person
con la siguiente definición:Suponiendo que desee mostrar una lista de empleados en algún lugar, puede ser práctico enviar solo el
Id
,FirstName
yLastName
. Pero tendrá que enviar todas las demás propiedades irrelevantes. No es un gran problema si no le importa el tamaño de la respuesta, pero la idea general es enviar solo los datos relevantes. Por otro lado, puede diseñar una API que devuelva una lista de personas y, en ese caso, puede ser necesario enviar todas las propiedades, por lo que tiene sentido serializar y enviar las entidades. En este caso, crear una clase DTO es discutible. A algunas personas les gusta mezclar entidades y DTO, a otras no.Para responder a su pregunta actualizada, EF es un ORM. Su trabajo es mapear los registros de la base de datos a objetos y viceversa. Lo que haces con esos objetos antes y después de pasar por EF no es parte de sus preocupaciones. Tampoco debería ser.
fuente
As of EF Core 2.1, only services known by EF Core can be injected. Support for injecting application services is being considered for a future release.
me gusta mucho que me inyecten servicios de aplicaciones en mis entidades.No, no es.
Idealmente, los DTO coincidirán con sus repositorios de persistencia (también conocidos como tablas de su base de datos).
Pero sus clases de negocios no son necesariamente una coincidencia. Es posible que necesite clases adicionales o clases separadas o unidas a lo que tiene en la base de datos. Si su aplicación es pequeña, es posible que no vea este tipo de problemas, pero en aplicaciones medianas a grandes, esto sucederá con frecuencia.
Otra cosa es que los DTO son parte del dominio de lo que sea que trate con persistencia, mientras que su Business Layer no debe saber nada sobre ellos.
fuente
En realidad es una muy mala idea. Martin Fowler tiene un artículo sobre DTO locales .
En pocas palabras,
DTO
Pattern se usó para transferir datos fuera del proceso, por ejemplo a través del cable y no entre capas dentro del mismo proceso.fuente
No, es una mala práctica.
Algunas razones:
@JsonIgnore
del mundo de Java), pero esto lleva al siguiente problema ...get
método de la entidad.Por lo tanto, es más fácil y seguro usar algún tipo de herramienta de mapeador para ayudarlo en este trabajo, mapeando los campos de entidad a un Dto.
fuente
Para completar lo que dijo @Dherik, los principales problemas de usar objetos de entidad como objetos de transferencia de datos son:
En una transacción, corre el riesgo de comprometer los cambios realizados en su entidad porque la usa como DTO (incluso si puede separar la entidad de la sesión en una transacción, la mayoría de las veces deberá verificar este estado antes cualquier modificación en su entidad-DTO y asegúrese de que no está en una transacción o que la sesión se ha cerrado si no desea que las modificaciones persistan).
El tamaño de los datos que comparte entre el cliente y el servidor: a veces no desea enviar todo el contenido de una entidad al cliente para minimizar el tamaño de la respuesta de la solicitud. Separar el DTO de la entidad es más flexible, para especializar los datos que desea enviar en ciertos casos de uso.
Visibilidad y mantenimiento: debe administrar sus anotaciones jpa / hibernate en los campos de su entidad y mantener las anotaciones jackson para serializar en json en el mismo lugar (incluso si puede separarlas de la implementación de la entidad al colocarlas en la interfaz heredada por el entidad). Luego, si cambia su contenido DTO al agregar un nuevo campo, otra persona probablemente pueda pensar que es un campo de la entidad, por lo tanto, un campo de la tabla en cuestión en su base de datos (incluso si puede usar la
@Transient
anotación en todos sus campos DTO para el caso ..!).En mi opinión, crea ruido cuando lees la entidad, pero mi opinión es seguramente subjetiva.
fuente