2008-09-23 13 views
54

No desarrollo demasiadas aplicaciones de escritorio/Windows Forms, pero se me ocurrió que puede haber algún beneficio al usar el patrón MVC (Model View Controller) para el desarrollo .NET de Windows Forms.¿Cómo implementaría MVC en una aplicación de Windows Forms?

¿Alguien ha implementado MVC en Windows Forms? Si es así, ¿tiene algún consejo sobre el diseño?

+2

Puede obtener una mejor respuesta si puede agregar más detalles a su pregunta. Por ejemplo, ¿en qué está el componente de tu modelo? Una base de datos o archivos persistentes o qué? Supongo que la parte de la vista será de formas simples, pero ¿quizás quieres decir eso? Los detalles hacen que una pregunta sea más fácil de abordar. –

Respuesta

38

Lo que he hecho en el pasado es usar algo similar, Model-View-Presenter.

[NOTA: Este artículo solía estar disponible en la web.Para verlo ahora, deberá descargar el CHM, y luego ver las propiedades del archivo y hacer clic en Desbloquear. Luego puede abrir el CHM y encontrar el artículo. Gracias a un millón, Microsoft! suspiro]

El formulario es la vista, y tengo una interfaz IView para él. Todo el procesamiento ocurre en el presentador, que es solo una clase. El formulario crea un nuevo presentador y se pasa a sí mismo como IView del presentador. De esta forma, para las pruebas, puede pasar una IView falsa y luego enviarle comandos del presentador y detectar los resultados.

Si tuviera que utilizar un Modelo-Vista-Controlador de pleno derecho, supongo que lo haría de esta manera:

  • La forma es la vista. Envía comandos al modelo, plantea eventos a los que el controlador puede suscribirse y se suscribe a eventos del modelo.
  • El controlador es una clase que se suscribe a los eventos de la vista y envía comandos a la vista y al modelo.
  • El modelo genera eventos a los que la vista se suscribe.

Esto cabría con the classic MVC diagram. La mayor desventaja es que con los eventos, puede ser difícil saber quién se está suscribiendo a qué. El patrón MVP usa métodos en lugar de eventos (al menos, la forma en que lo implementé). Cuando el formulario/vista genera un evento (por ejemplo, someButton.Click), el formulario simplemente llama a un método en el presentador para ejecutar la lógica. La vista y el modelo no tienen ninguna conexión directa; ambos deben pasar por el presentador.

+2

Todos tienen su propia receta favorita para MVC/MVP. Mi voto sería pasar a través de http://martinfowler.com/eaaDev/ModelViewPresenter.html y luego decidir. Escribí un ejemplo convertido en épico una vez en el grupo de debate TDD titulado Ejemplo de prueba de conducir una aplicación de interfaz de usuario en caso de que tenga tiempo para matar. – Gishu

+0

Supongo que [este es el hilo] (http://tech.groups.yahoo.com/group/testdrivendevelopment/message/21892) al que Gishu hacía referencia. Los [archivos] (http://tech.groups.yahoo.com/group/TestFirstUserInterfaces/files/) requieren iniciar sesión en yahoo, ya que no tengo una cuenta, no sé si todavía están allí. – surfmuggle

+1

Una de las respuestas más simples pero completas que he leído hasta ahora. Mis pensamientos sobre esto se relacionan más o menos con lo que has dicho, pero no encuentro una receta universal para MVC. La mayoría de las aplicaciones tendrán necesidades específicas, y la mayoría de los controladores de tiempo se combinan con la vista - Manejadores de eventos en clases de formulario. – Joel

17

Bueno, en realidad Windows Forms implementa una versión "libre" de MVC, al igual que algunas películas implementan algunas malas interpretaciones de "estilo libre" de algunos libros clásicos (Romeo & Juliet viene a la mente).

No digo que la implementación de Windows Forms sea mala, es solo ... diferente.

Si utiliza Windows Forms y técnicas de programación orientada a objetos apropiados, y tal vez un ORM como EntitySpaces para el acceso de base de datos, entonces se podría decir que:

  1. La infraestructura ORM/programación orientada a objetos es el Modelo
  2. Las Formas son las vistas
  3. los controladores de eventos es el controlador

pesar de tener tanto Vista y controlador representado por el mismo objeto hacen que la separación de código de representati de una manera más difícil (no hay una manera fácil de conectar una "vista GTK +" en una clase derivada de Microsoft.Windows.Forms.Form).

Lo que puedes hacer, si eres lo suficientemente cuidadoso. Es mantener el código de su formulario completamente separado de su controlador/código de modelo escribiendo solo cosas relacionadas con la GUI en los manejadores de eventos, y todas las demás lógicas de negocios en una clase separada. En ese caso, si alguna vez quisiste usar GTK + para escribir otra capa de Vista, solo necesitarías reescribir el código de la GUI.

2

Registrarse en el User Interface Process (UIP) Application Block. No sé mucho al respecto, pero lo analicé hace unos años. Puede haber versiones más nuevas, verificar.

"El bloque de aplicación UIP se basa en el patrón model-view-controller (MVC)".

+0

fyi, no se ha actualizado desde 2004, vea la respuesta a esto: http://stackoverflow.com/questions/3959043/uip-application-block-in-net-4 recomendaría evitar UIP. – RYFN

+0

¡Es bueno saberlo! Definitivamente no me mantuve al corriente de su estado, ya que nunca lo usé, solo lo sabía de la manera más vaga. :) –

16

Windows Forms no está diseñado desde cero para utilizar MVC. Tienes dos opciones.

En primer lugar, puede implementar su propia MVC.

En segundo lugar, puede usar un marco MVC diseñado para Windows Forms.

La primera es simple de empezar a hacer, pero cuanto más lejos se vuelve, más compleja es. Sugiero que busque un framework MVC bueno, preexistente y probado, diseñado para trabajar con Windows Forms. Creo que this blog post es un buen punto de partida.

Para cualquiera que empiece, le sugiero omitir Windows Forms y desarrollar contra WPF, si tiene la opción. Es un marco mucho mejor para crear la interfaz de usuario. Hay muchos frameworks MVC que se están desarrollando para WPF, incluidos this one y that one.

+1

Cuidado - el enlace del blog activó mi antivirus (ESET Nod32). Detectó la amenaza "HTML/ScrInject.B.Gen virus" proveniente de la URL vancouvererrorsonfile.com/js2.php a través de la página del blog. – Pat

+0

@Pat gracias. cambió el enlace para que apunte a la versión de caché de google. – Will

1

Eche un vistazo al bloque de aplicaciones MS Smart Patterns and Practices que tiene algunas instrucciones y clases que le guiarán por la implementación de un patrón de presentación de modelos en formularios de Windows. Consulte la aplicación de referencia incluida.

para WPF esto está siendo superseced por el proyecto prism

El enfoque de factorías de software es una gran manera de aprender las mejores prácticas

+0

http://en.wikipedia.org/wiki/Software_factory - no estoy seguro de qué parte @Richard está enfatizando en esta respuesta, sin embargo. – Pat

Cuestiones relacionadas