Exponer modelos de dominio sobre API

8

Estoy creando una API RESTful simple para una aplicación basada en web en la que estoy trabajando, y me pregunto cuál es la mejor manera de exponer mis modelos de dominio.

Digamos que tengo una clase de usuario y quiero proporcionar una respuesta JSON con las distintas propiedades del usuario. Obviamente, no quiero exponer públicamente todas las propiedades de mi modelo (como DateCreated, PasswordHash, etc.) debido a problemas de seguridad y ancho de banda.

He leído en Objetos de transferencia de datos y me pregunto si este es el camino a seguir. Si tengo razón, podría pasar, por ejemplo, un modelo de usuario a mi DTO de usuario y garantizar que dicha DTO solo permita la exposición de las propiedades de usuario que elija (lo que también ayudaría a desacoplar mis modelos de mi API pública).

¿Es esta solución adecuada o hay mejores maneras de hacerlo?

Gracias.

    
pregunta James 24.09.2013 - 12:47

2 respuestas

6

Esa es exactamente una de las razones por las que existen DTO.

La compensación aquí es que agregar DTO hace que su implementación sea un poco más compleja y, por lo tanto, propensa a errores, como una falta de coincidencia en la asignación del objeto de dominio a un DTO. ¡Usa pruebas unitarias para esto!

Otra cosa que podría hacer con su DTO y tiende a pasarse por alto en los servicios REST es el tratamiento de datos de hipertexto para referencias, objetos anidados y posibles operaciones.

Consulte la PoEAA de Martin Fowler: "[...] vale la pena mencionar que otra ventaja es encapsular el mecanismo de serialización para transferir datos a través del cable. Al encapsular la serialización de esta manera, los DTO mantienen esta lógica fuera del resto del código y también proporcionan un punto claro para cambiar la serialización si lo desea. "

enlace

TL; DR: Me gusta la idea de separar las preocupaciones de la lógica del dominio y el "cableado RESTful" a través de DTOS, aunque introduciendo un diseño más complejo.

    
respondido por el viniciushana 24.09.2013 - 16:04
3

Aunque no es el objetivo principal de Objetos de transferencia de datos , los DTO se pueden usar para satisfacer esta inquietud de una manera similar. de la parte de datos de un Modelo de presentación .

Como se ha señalado, esto puede inflar su diseño y algo tan simple como un campo agregado puede requerir cambios para hacer burbujas a través de las capas adicionales. Debido a esto, es recomendable ver si puede proporcionar metadatos para describir la serialización del objeto . En muchos idiomas, esto toma la forma de anotaciones especializadas que se pueden aplicar a los objetos de su dominio para evitar la tediosa traducción a DTO. Los paquetes como Jackson ( a través del uso de Mixins ) a menudo llevan esta idea un poco más lejos para separar completamente los metadatos de su modelo de dominio.

    
respondido por el smp7d 24.09.2013 - 18:32

Lea otras preguntas en las etiquetas