Tuve un gran éxito con este patrón Passive Screen.
En mi opinión, el gran problema de la arquitectura tradicional de MVC es que las personas importan demasiado en las clases de formularios. Esto aumenta la cantidad de pruebas manuales que tiene que hacer.
Cuantas más pruebas automatizadas puede hacer después de compilar, más errores detectará en su escritorio. En una aplicación compleja, los efectos secundarios incluso de cambios menores ocurren con demasiada frecuencia.
El truco para resolver esto es hacer un ensamblaje de controlador al que haga referencia el ensamblado de formularios (o EXE). Cada formulario tiene una clase correspondiente en el conjunto. Al hacer clic en un botón se llamará al ThisForm.ThisButton(<args>)
, que luego disparará objetos más abajo en su marco. Cada formulario implementa una interfaz para que, si la clase de controlador necesita información adicional del formulario, tiene una interfaz para recuperarla.
Luego, para su unit testing simula un operador que realiza operaciones complejas al implementar clases ficticias para disparar eventos y alimentar información a las clases de controlador. Las clases de controlador no conocen ninguna diferente ya que las clases ficticias implementan todas las interfaces esperadas.
Hay una excepción importante y eso es para diálogos triviales. Para los cuadros de diálogo que tienen algunas casillas de verificación siento que esta organización es excesiva. Uso el command pattern mucho. Entonces, en el ensamblaje donde defino los objetos de comando, pongo el diálogo SIMPLE asociado con ese comando. Qué tan simple tiene que ser un diálogo para obtener este tratamiento depende de usted.
Me gusta estructurar mis aplicaciones de la siguiente manera.
Utilidad - Se trata de un montaje que tiene cosas que utilizo todo el tiempo - Las funciones matemáticas, función de archivo, etc.
Objetos - Esto tiene los objetos específicos que estoy usando para esta aplicación.
UIFramework - Define todas las interfaces de formulario y controlador.
Comandos - Esto tiene todos los objetos Command que manipulan mis objetos de aplicación.
UI - Objetos que implementan las interfaces de controlador
EXE - Formas que implementan la interfaz de forma y llama a los objetos del controlador.