Pregunta

¿Qué es un objeto de transferencia de datos?

En MVC son las clases de modelo DTO, y si no, ¿cuáles son las diferencias y necesitamos ambas?

¿Fue útil?

Solución

Un objeto de transferencia de datos es un objeto que se utiliza para encapsular datos y enviarlos de un subsistema de una aplicación a otro.

Los DTO son los más utilizados por la capa de Servicios en una aplicación N-Tier para transferir datos entre sí y la capa de IU. El principal beneficio aquí es que reduce la cantidad de datos que deben enviarse a través del cable en aplicaciones distribuidas. También hacen excelentes modelos en el patrón MVC.

Otro uso para los DTO puede ser encapsular parámetros para llamadas a métodos. Esto puede ser útil si un método toma más de 4 o 5 parámetros.

Al usar el patrón DTO, también utilizaría ensambladores DTO. Los ensambladores se utilizan para crear DTO a partir de objetos de dominio, y viceversa.

La conversión de objeto de dominio a DTO y viceversa puede ser un proceso costoso. Si no está creando una aplicación distribuida, probablemente no verá grandes beneficios del patrón, como Martin Fowler explica aquí

Otros consejos

La definición de DTO se puede encontrar en sitio de Martin Fowler . Los DTO se utilizan para transferir parámetros a métodos y como tipos de retorno. Mucha gente usa esos en la interfaz de usuario, pero otros inflan objetos de dominio de ellos.

Un DTO es un objeto tonto: solo contiene propiedades y tiene captadores y establecedores, pero no tiene otra lógica de importancia (aparte de una implementación de comparación () o equals ()).

Normalmente, las clases de modelos en MVC (suponiendo que .net MVC aquí) son DTO, o colecciones / agregados de DTO

En general, los objetos de valor deben ser inmutables. Al igual que los objetos Integer o String en Java. Podemos usarlos para transferir datos entre capas de software. Si las capas o servicios de software se ejecutan en diferentes nodos remotos, como en un entorno de microservicios o en una aplicación Java Enterprise heredada. Debemos hacer copias casi exactas de dos clases. Aquí es donde conocimos a los DTO.

|-----------|                                                   |--------------|
| SERVICE 1 |--> Credentials DTO >--------> Credentials DTO >-- | AUTH SERVICE |
|-----------|                                                   |--------------|

En Java Enterprise Systems, los DTO pueden tener varias cosas EJB en él.

No sé si es una práctica recomendada o no, pero personalmente uso Value Objects en mis proyectos Spring MVC / Boot como este:

        |------------|         |------------------|                             |------------|
-> Form |            | -> Form |                  | -> Entity                   |            |
        | Controller |         | Service / Facade |                             | Repository |
<- View |            | <- View |                  | <- Entity / Projection View |            |
        |------------|         |------------------|                             |------------|
La capa

Controlador no sabe cuáles son las entidades. Se comunica con Formulario y Ver objetos de valor . Form Objects tiene anotaciones de validación JSR 303 (por ejemplo, @NotNull) y View Value Objects tiene anotaciones Jackson para la serialización personalizada. (por ejemplo, @JsonIgnore)

La capa de servicio se comunica con la capa de repositorio mediante el uso de objetos de entidad. Los objetos de entidad tienen anotaciones de datos JPA / Hibernate / Spring. Cada capa se comunica solo con la capa inferior. La comunicación entre capas está prohibida debido a la dependencia circular / cíclica.

User Service ----> XX CANNOT CALL XX ----> Order Service

Algunos marcos ORM tienen la capacidad de proyección mediante el uso de interfaces o clases adicionales. Por lo tanto, los repositorios pueden devolver objetos View directamente. Ahí no necesitas una transformación adicional.

Por ejemplo, esta es nuestra entidad de usuario:

@Entity
public final class User {
    private String id;
    private String firstname;
    private String lastname;
    private String phone;
    private String fax;
    private String address;
    // Accessors ...
}

Pero debe devolver una lista paginada de usuarios que solo incluya id, nombre y apellido. Luego puede crear un objeto de valor de vista para la proyección ORM.

public final class UserListItemView {
    private String id;
    private String firstname;
    private String lastname;
    // Accessors ...
}

Puede obtener fácilmente el resultado paginado de la capa de repositorio. Gracias a Spring también puedes usar solo interfaces para proyecciones.

List<UserListItemView> find(Pageable pageable);

No se preocupe por otras operaciones de conversión BeanUtils.copy el método funciona bien.

  1. Para mí, la mejor respuesta a la pregunta qué es un DTO es que los DTO son objetos simples que no deberían contener ninguna lógica de negocio o implementación de métodos que requieren pruebas .
  2. Normalmente, su modelo (que utiliza el patrón MVC) son modelos inteligentes, y pueden contener muchos / algunos métodos que realizan específicamente algunas operaciones diferentes para ese modelo (no la lógica de negocios, esto debería estar en los controladores). Sin embargo, cuando transfiere datos (por ejemplo, llamando a un punto final REST (GET / POST / lo que sea) desde algún lugar, o consumiendo un servicio web usando SOA, etc.) no desea transmitir el objeto de gran tamaño con código que no es necesario para el punto final, consumirá datos y ralentizará la transferencia.

Con MVC, los objetos de transferencia de datos a menudo se usan para asignar modelos de dominio a objetos más simples que finalmente se mostrarán en la vista.

De Wikipedia :

  

El objeto de transferencia de datos (DTO), anteriormente conocido como objetos de valor o VO, es   Un patrón de diseño utilizado para transferir datos entre aplicaciones de software   subsistemas Los DTO a menudo se usan junto con el acceso a datos   objetos para recuperar datos de una base de datos.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top