2009-09-25 11 views
6

Después de ver el vídeo por Greg Yound en DDD¿Cómo implementar CQS con cambios en la memoria?

http://www.infoq.com/interviews/greg-young-ddd

me preguntaba cómo se puede poner en práctica la separación de comandos de consulta (SCC) con DDD cuando se tiene en cambios en la memoria?

Con CQS que tiene dos repositorios, uno de los comandos, uno para consultas. Además de dos grupos de objetos, objetos de comando y objetos de consulta. Los objetos de comando solo tienen métodos y no tienen propiedades que puedan exponer la forma de los objetos, y no se deben usar para mostrar datos en la pantalla. Los objetos de consulta, por otro lado, se usan para mostrar datos en la pantalla.

En el video los comandos van siempre a la base de datos, y de esta manera puede utilizar el repositorio de consulta para recuperar los datos actualizados y volver a mostrar en la pantalla.

¿Podría usar CQS con algo así como editar pantalla en ASP.NET, donde se realizan cambios en la memoria y la pantalla debe actualizarse varias veces con los cambios antes de que los cambios se mantengan en la base de datos?

Por ejemplo

  1. voy a buscar un objeto de consulta desde el repositorio de consulta y mostrarlo en la pantalla
  2. que haga clic en Editar
  3. que vuelva a recuperar un objeto de consulta desde el repositorio de objetos de consulta y mostrarlo en la la forma en modo de edición
  4. que cambiar un valor en el formulario, que autoposts atrás y va a buscar el objeto de comando y emite el comando relevante
  5. Qué hacer: ahora necesito para mostrar la UPDA objeto ted a medida que el comando realizó cambios en los campos calculados. Como el objeto de comando no se ha guardado en la base de datos, no puedo usar el repositorio de consultas. Y con CQS no estoy destinado a exponer la forma del objeto de comando para mostrar en la pantalla. ¿Cómo recuperaría un objeto de consulta con los cambios actualizados para mostrar en la pantalla?

Un par de soluciones posibles que puedo pensar es tener un repositorio de sesión, o una forma de obtener un objeto de consulta desde el objeto de comando. ¿O no se aplica CQS a este tipo de escenario?

Me parece que en el video los cambios persisten directamente en la base de datos, y no he encontrado un ejemplo de DDD con CQS que resuelva el problema de los cambios de lotes en un objeto de dominio y actualice la vista del objeto de dominio modificado antes de emitir finalmente un comando para guardar el objeto de dominio.

Respuesta

1

Si realmente desea utilizar CQS para esto, yo diría que tanto el repositorio de consultas y el Comentario de recompra ambos tienen una referencia al mismo almacén de respaldo.Por lo general, esta referencia se realiza a través de una base de datos externa, pero en su caso podría ser una lista <T> o similar.

+1

Gracias por la respuesta. Me pregunto qué tan común/bueno es un diseño para usar CQS cuando los cambios están en la memoria, en lugar de persistir directamente a la base de datos? Esto es básicamente lo que hemos propuesto es usar repositorios de sesión para permitir que el repositorio de consultas acceda a los datos del comando a través de una variable de sesión. Quizás necesite repositorios HttpContext más tarde. ¿Alguien ha visto esto implementado antes? Pensamientos apreciados. – Ian

+0

En mi opinión, el método que utiliza para manipular una fuente de datos no debe depender del tipo de fuente de datos. El patrón Repositorio le permite abstraer estas diferencias, lo que le permite tratar cualquier fuente de datos como si se tratara de una colección de objetos consultable.Depende de las implementaciones de repositorio individuales determinar la fuente de datos objetivo, por lo que en teoría tendrías un 'InMemoryRepository' y un 'DatabaseRepository', o lo que sea. –

+0

Sí, entiendo que puede cambiar el repositorio de InMemory para el repositorio de la base de datos. Parte del valor de CQS es que usted emita comandos a la base de datos y retire por separado los datos actualizados con el repositorio de consultas. En memoria, el objeto de comando está en sesión, por lo que el repositorio de consultas solo puede recuperar datos en el objeto de comando. Con la versión de la base de datos, entonces el objeto de consulta puede ser totalmente diferente al objeto de comando, simplemente parece que con la memoria CQS la relación es mucho más cercana. Preguntándose cómo encaja esto con lo que CQS estaba tratando de lograr – Ian

0

en la memoria, por lo general, se utilizaría el Observer design pattern.

En realidad, siempre se quiere utilizar este patrón, pero la mayoría de las bases de datos no ofrecen una forma eficiente de llamar a un método en su aplicación cuando algo cambia en el PP.

+0

No estoy seguro de si me pregunta. Con CQS, está separando las lecturas de las escrituras. Donde el repositorio Query está separado del repositorio Write. Entonces, si no guardo la entidad de dominio en el repositorio, ¿cómo puede el repositorio de consultas obtener los datos? ¿Necesitaría una forma de obtener un objeto de consulta del objeto de dominio con el estado actualizado, o está diciendo que un objeto de consulta observaría un objeto de dominio y se actualizaría a sí mismo? ¿O posiblemente introducir un repositorio de sesión? – Ian

0

El patrón de diseño Unit of Work de Patterns of Enterprise Application Architecture coincide muy bien con CQS: básicamente es un gran comando que persiste en la base de datos.

+0

Gracias por el enlace, pero aún no responde mi pregunta. Básicamente con CQS tienes un objeto que solo tiene métodos (los comandos) y otro objeto que contiene la forma del objeto. Hay dos repositorios, uno para el objeto de comando y otro para el objeto de consulta. De modo que nunca usa el objeto de comando para volver a llenar la pantalla, sino que utiliza el objeto de consulta. Sin guardar los cambios del objeto de comando en la base de datos, ¿cómo volver a mostrar los cambios realizados llamando a los comandos? Dado que los cambios no están en la base de datos, no puede usar el repositorio de consultas. – Ian

3

Así que lo que parece que quieres aquí es un comando más granular.

EG: el usuario interactúa con la página web (digamos haciendo un check out con un carrito de compras).

Las páginas múltiples que obtienen información están creando un comando. El comando no se envía hasta que el usuario actualmente compruebe dónde se envía toda la información en un solo comando al dominio, vamos a llamarlo un comando "CheckOut".

Los modelos de presentación son bastante útiles para abstraer este tipo de interacción.

Espero que esto ayude.

Greg

+0

Hola Greg, ¿Tiene algún ejemplo de esto? En este momento he seguido la ruta de tomar el objeto de consulta y ponerlo en un objeto de "carrito de compras", que serializa el objeto de consulta para permitir cambios entre las devoluciones (también podría usar la sesión). Una vez que el objeto ha terminado de actualizarse, se pasa al objeto de comando. Si tuviera más tiempo, podría utilizar un objeto diferente al objeto de consulta para almacenarlos en cambios de edición, como un modelo de presentación. Estoy usando el mismo objeto para mostrar y editar, ¿es esto lo mismo con su modelo de presentación propuesto? Gracias – Ian

1

también para el resto de sus preocupaciones ...

Estos son más que las preocupaciones con consistencia eventual a diferencia de CQRS. No es necesario que con el tiempo sea coherente con CQRS, puede hacer que el procesamiento del comando también escriba en la tienda de informes (o use la misma tienda física para ambos, como se mencionó) de manera consistente. De hecho, recomiendo a las personas que hagan esto como su arquitectura base y que luego presenten la coherencia final cuando sea necesario, ya que hay costos asociados con ella.

+0

No estoy seguro de si esto se aplica a mi situación, hasta ahora solo tengo una base de datos, así que no tiene que preocuparse de actualizar el almacén de informes, y los objetos de comando usan NHibernate para que los cambios se mantengan en la base de datos. ¿O esto se aplica a mi situación? ¿No estás seguro de a qué preocupación te refieres? – Ian

Cuestiones relacionadas