2009-08-27 15 views
5

he estado construyendo una nueva aplicación que utiliza mi entendimiento actual del diseño de dominio impulsada. Hasta ahora, tengo un grupo de clases que representan entidades en mi dominio y un repositorio para recuperar desde/persistir en la base de datos.Domain Driven Design: Cómo recuperar las listas de datos complejos

El problema que estoy en es que en la interfaz de usuario Tengo una necesidad de mostrar algunas listas, donde los elementos de la lista no se asignan directamente a las entidades en mi dominio. Parte de la lista podría construirse haciendo una carga bastante profunda de determinadas entidades, pero otros datos se sintetizan esencialmente en el momento de la recuperación y no son parte de ninguna entidad. Permítanme darles un ejemplo que con suerte explicará el problema más claramente.

En mi dominio que tienen las evaluaciones (un conjunto de preguntas para responder) y respuestas (las respuestas que cada usuario ha proporcionado a la evaluación) a dichas evaluaciones. También tengo acciones. Cada acción representa una acción que se ha tomado con una respuesta (enviar, aprobar, rechazar, etc.). También tengo usuarios.

Una de las listas de datos que necesito mostrar incluiría respuestas y evaluaciones (que no se han respondido), luego cada línea incluiría información sobre el usuario que está trabajando actualmente con la respuesta (esto se determina en tiempo de recuperación al observar las acciones que se han tomado en una respuesta). Cada elemento de línea también incluiría cero o más elementos secundarios, que son acciones que se han llevado a cabo en la respuesta hasta el momento.

El problema es que a partir de ahora no tengo ninguna manera de representar a todo este conjunto de datos con mis entidades del dominio. Mi primera reacción sería simplemente recuperar una tabla de datos de la base de datos y omitir las entidades de mi dominio. Pero veo mucho valor al trabajar con objetos de dominio y tener las relaciones entre diferentes entidades cocidas en los objetos mismos. Así que mi próxima idea sería modificar las entidades de mi dominio para que sean compatibles con estas listas, pero me preocupa tanto que agregaría propiedades extrañas a mis entidades solo para respaldar estos escenarios de listado y que podría estar perjudicando el rendimiento haciendo básicamente cargas profundas de objetos cuando solo necesito esos datos en algunos lugares en mis aplicaciones.

Respuesta

2

yo sugeriría no se están viendo esto como algo que tienes que meter con calzador en sus entidades, sino más bien proporcionar un servicio (en la jerga de diseño de dominio impulsada), cuyo trabajo consiste en recoger estos datos cuando se le solicite y presentarlo como una vista. Esto te libera de tener que volver a trabajar tus entidades de una manera torpe.

El problema es que, en este momento, no tengo ninguna forma de representar este conjunto de datos completo con las entidades de mi dominio.

La extraña fricción de diseño que siente aquí es algo bueno. Es una pista de que las cosas no encajan del todo.

+0

Ok, ahora estoy leyendo sobre los servicios. Cuando dice que el servicio presentará los datos como una vista, ¿cuál es la vista? ¿Es una clase que se define solo para este propósito? ¿Está compuesto de entidades de dominio? –

+1

Estoy usando view en el sentido MVC, es decir, algo cuyo trabajo es mostrarte cosas. El servicio agregará los datos relevantes reales, que luego se entregarán y se les pedirá que muestren (en su caso, esa es la "lista de datos" que menciona).Un servicio bien puede decidir envolver cosas en clases separadas (particularmente si muchas vistas usan los mismos datos) antes de entregarlo a las vistas, pero eso de ninguna manera es requerido. –

2

Parece que tienes, (a través de la aparición de esta dificultad) identificado un problema con su modelo de dominio. La abstracción que desea mostrar en cada uno de estos cuadros de lista, aparentemente no está bien representada en su modelo de dominio, ni en su "lenguaje ubicuo". Decidir lo que es, un nombre, y agregar el código en su repositorio para generar listas de estos objetos, si resultan ser entidades u objetos de valor ...

+1

De hecho - I puede ser mal entendido el problema en cuestión, pero mi impresión inicial es que las entidades del dominio sólo tiene propiedades adicionales: es decir, las entidades de respuesta deben tener una acciones (o ActionHistory) Propiedad de representar "las acciones que se han tomado en la respuesta hasta aquí." –

+0

Parece que comprende el problema que estoy teniendo. Estoy considerando agregar esas propiedades adicionales, pero sinceramente, parte de mi preocupación al hacerlo se relaciona con la posibilidad de que se carguen más datos de los que realmente necesito en determinados momentos. Las acciones son bastante sencillas y no serían un problema, pero mis entidades de usuario son bastante complejas y parece mucho trabajo extra cargar todo el usuario cuando todo lo que realmente necesito es el nombre de usuario y el nombre. Pero cargar parcialmente una entidad me parece realmente raro. –

+1

Si se trata de un problema de rendimiento/optimización, la respuesta de John Feminella (para crear un método de servicio para manejarla) sería definitivamente apropiada. Habiendo dicho eso, muchas herramientas OR/M te permitirán cargar estas propiedades (lo que es discutible, por supuesto, si no estás usando una de ellas o no estás rodando tu propio repositorio o capa de acceso a datos). –

Cuestiones relacionadas