Por lo que vale (estoy desarrollando en C# .net - pero los principios deberían seguir siendo útiles) He definido un montón de tipos (DTO) que utilizo para intercambiar datos entre la empresa y niveles de datos; y tengo más de un tipo por objeto/entidad de dominio. Estos se definen como clases simples.
Cada una de ellas está construida con una tarea específica en mente, por ejemplo:
- que tienen un tipo de peso ligero diseñado para llenar las vistas de lista (un montón de "filas", pero no muchos "columnas") . También tengo un tipo de colección correspondiente que contiene cualquier cantidad de estos.
- Tengo una copia "grande" que normalmente tiene todas las propiedades de la entidad en cuestión, pero solo para una instancia de la misma. Puedo tener más de uno de estos dependiendo del tamaño y la complejidad de la entidad frente a los casos de uso; y también dependiendo de si desea devolver todos los datos asociados con una instancia de la entidad de inmediato, o cargar algunos de forma lenta en las solicitudes posteriores.
- También suelo tener tipos de "guardar" (nuevo) y "actualizar" por separado para la entidad.
Cada tipo está diseñado para contener sólo la información relevante para una tarea determinada. Por ejemplo, el "grande" devolverá la fecha de la última modificación, pero no espero eso en mis tipos de guardar y actualizar porque los rellene en la capa de acceso a datos.
Además, para mi aplicación, estos tipos existen en un conjunto común, por lo que se pueden reutilizar entre cualquier nivel, no solo entre los niveles comerciales y de datos.
arquitectónico Fit
No hay nada particularmente especial acerca de este enfoque, que tiene sus pros y contras propios; exactamente qué son y cómo te afectan dependerá de muchas cosas, supongo que tu kilometraje variará, pero desde luego me ha sido útil durante varios años.
Las personas a menudo hacen un escándalo por la "separación de preocupaciones", y ese es un paso realmente inteligente; esto se relaciona con DTO en el sentido de que se intercambian entre capas (y servicios, componentes, etc.) por lo que siempre puede existir cierta ambigüedad sobre dónde exactamente dibujar la línea.
que toma el enfoque que si un bit de información es apto para ser intercambiados entre a niveles que probablemente es apto para ser intercambiados entre cualquier número de niveles - ¿por qué no lo hacen accesible a todos? También ahorra tener que volver a transmitir información si solo la está pasando.
En cuanto a la complejidad va - hay dos maneras de manejar que:
- utilizar una convención verbosa/legible nomenclatura para todos; los tipos para que sepas qué son las cosas; no importa cuántos hay, para eso sirve el intelli-sense (& documentos). Cuanto más intuitivo, mejor.
- BESO - mantenga las cosas simples si puede; tendrá que equilibrar la reutilización sensible y el Principio de Responsabilidad Individual (SRP).
crearía un DTO de un complejo propiedad de una entidad principal?
me he encontrado haciendo DTO para una de 2 razones:
- Hay datos Sé que necesito para exponer (push), y el diseño de la DTO es una obviedad: es conducido por los datos que quiero exponer
- Pull: el consumidor sabe lo que quiere, y el DTO está diseñado para satisfacer esas necesidades.
Dado que todos están definidos en un conjunto común, ningún componente "lo posee", lo ayuda a forzarlo a pensar desde una perspectiva de "dominio" en lugar de uno centrado en componentes; en cierta medida, esto influirá en el diseño de los DTO (balanceo de reutilización vs SRP).
En ambos casos, las DTO pueden ser silenciosas específicas para una necesidad particular, o genéricas; Por ejemplo, una DTO que tiene solo un int y una cadena no es poco común, es el tipo de cosa que usaría para enviar a listas desplegables.
La mayoría de las colecciones de DTO que envío (de DAL a BL) son específicas de un concepto, no genérico. Implico reglas muy muy básicas sobre estos a través de los constructores que ofrezco: se requiere cada arg. No estoy seguro de si esto responde a su pregunta "¿Cómo se gestiona el montaje y la validación?".
Gracias Adrian, en general esto es más o menos lo que tenía en mente. Aún me gustaría ver cómo todo esto cabe en una aplicación desde la perspectiva del diseño/arquitectura y cuál es el nivel de aceptación hacia el uso de DTO de esta manera. He leído muchos consejos para implementar este tipo de diseño, pero no he visto ninguna explicación concisa de cómo todo encaja coherentemente con las pautas adecuadas, las mejores prácticas y preferiblemente un ejemplo. – arrages
crearía un DTO de una propiedad compleja de una entidad principal; en nuestra aplicación, muchas de las propiedades, si no la mayoría, se toman de una base de datos a populares cuadros de selección desplegables, la mayoría de ellos descienden a ID y una descripción. ¿Cómo se gestiona el montaje y la validación? – arrages
RE Ejemplos: En cuanto a los ejemplos, sigo esto en mi marco de aplicación web de código abierto; pero está en asp.net, así que no estoy seguro de lo útil que será. No tengo ningún artículo que lo discuta, tendrá que mirar el código fuente :(- http://www.morphological.geek.nz/ –