¿Estoy poniendo en práctica el patrón MVP / Presentación Modelo de interfaz de usuario correctamente?

StackOverflow https://stackoverflow.com/questions/3435834

Pregunta

Estoy re-trabajar una aplicación de Windows Forms y le gustaría emplear una variación del patrón Presentación Modelo para la interfaz de usuario. Podría alguien decir de las siguientes explicaciones si lo estoy haciendo correctamente?


He decidido crear dependencias de la siguiente manera:

   Model <---- Presentation Model <---- View

Esto es:

  • El modelo no es consciente de nada sino de sí mismo.

  • El modelo de presentación tiene una referencia al modelo (pero no viceversa).

  • La vista tiene una referencia al modelo de presentación (pero no viceversa).

Estoy utilizando los datos Winforms vinculante para mantener la vista y el modelo de presentación sincronizada.

Ahora bien, esta todo funciona de maravilla, excepto cuando tenga que hacer frente a, por ejemplo, Un clic en el botón "Cerrar" de una forma. Dado que el modelo de presentación no tiene ninguna referencia a la vista, no puede suscribirse a los eventos publicados por la vista. Así que he llegado con la siguiente muleta:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

Esto es:

  • El usuario hace clic en el botón "Cerrar".

  • Click evento del botón se capturó en la vista, que reacciona mediante el establecimiento de la propiedad CloseRequested.

  • El enlace de datos transfiere este valor a una propiedad correspondiente en el modelo de presentación.

  • El modelo de presentación reacciona a este cambio mediante el establecimiento de su propiedad IsClosed.

  • Los datos transferencias vinculante este valor en MustClose de la vista.

  • La vista reacciona a este cambio por el cierre de sí mismo.

El modelo de presentación está bastante bien desacoplada de la vista, y viceversa, sin embargo esto es un montón de trabajo sólo para procesar un comando único botón . ¿Hay una manera más fácil, dada la dependencia gráfico que he decidido en?

¿Fue útil?

Solución

He estado recientemente conversión de una aplicación de Windows Forms a la arquitectura MVP, y parece que haya configurado sus dependencias de una manera similar a lo que he estado haciendo. Sin embargo, simplemente tener una interfaz IPresenter que define métodos para permitir la vista de transmitir peticiones de usuario. Como la vista ya tiene una dependencia en el presentador y una referencia a él, parece sensato simplemente llame a los métodos de petición en él directamente.

Así que en mi sistema, las escuchas presentador para los eventos del modelo de incendios y sus propios eventos de presentación para cualquier vista interesado en escuchar hacia fuera. La vista responde a esos eventos por actualización de sí mismo según el caso, y hacia adelante solicitudes de los usuarios al presentador cuando se hacen.

Otros consejos

es sólo mi opinión.

Trabajo con el modelo de presentación requiere apoyo de interfaz de usuario 100% para el enlace de datos. Incluso WPF no hacen la acción cerca como enlazables. Una gran cantidad de cosas no va a trabajar sin problemas en el modelo de presentación como de mensaje de confirmación. incluso se puede abstraerse con interfaz Presentador pero todavía no lo hace el buen gusto y la simplicidad se sacrifica.

Por otro lado, los principales objetivos del modelo de presentación es poner a prueba la lógica de vista. En algunos casos, si su "Cerrar la acción" debe ser la unidad de prueba debido a que hay algo de lógica antes de que está cerca, entonces su código es la única opción. pero si es sólo una simple confirmación "¿Está seguro de que quiere salir", entonces es mejor poner eso en la vista no en el modelo de presentación, ya que no se requiere de probar la unidad.

  

La vista tiene una referencia a la   modelo de presentación (pero no a la   versa).

Que yo sepa la presentación debe tener un refference para ver más exactamente a la interfaz IView de modo que la dosis no par presentación con vista concreto. Luego, en clase de presentación puede llamar a los métodos de visualización y suscribirse a eventos de vista a través de IView.

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