2012-06-02 22 views
8

Necesito la vista para mantener una referencia al controlador porque necesita registrar el controlador como un detector de eventos. Necesito el controlador para mantener una referencia a la vista, porque al hacer clic en el botón, necesito poder obtener los archivos seleccionados en una lista. (tengo una lista de archivos, y un botón 'Añadir racimo', por lo que cuando se hace clic en el botón que necesito para obtener los archivos seleccionados)MVC - dependencia circular

Así que en resumen que tengo:

Controller controller(view); 
View view(controller); 

I' Estoy seguro que hay algún mal diseño aquí, simplemente no puede encontrar la manera de evitarlo ..

+0

Haga lo que [Swing hizo] (http://www.oracle.com/technetwork/java/architecture-142923.html) y combine el Controlador y la Vista. – Jeffrey

+0

Argumentaría en contra de hacer esto en MVC ya que por lo que recuerdo no está realmente hecho para el manejo de eventos del lado del servidor. Tal vez manejar eventos con jQuery sería mejor aquí. – Lilienthal

Respuesta

3

una posible solución:

  • simplemente dar un método controlador addView(View view)
  • Del mismo modo para Ver, proporciónele un método addController(Controller controller).
  • Haga que sea parte de su documentación que estos deben establecerse antes de su uso.
  • Asegúrese de verificar que las variables de referencia no son nulas antes de usarlas, ya que no se establecerán en el constructor.
+0

Gracias. Pensé en ello, pero no estaba seguro de que fuera correcto. – Shmoopy

+0

Estoy bastante seguro de que View no debe depender del controlador en el patrón MVC: solo debe depender del modelo –

+0

. Sugiere que la vista debe tener una referencia al controlador: eso es una dependencia –

1

Bueno, creo que puede usar la encapsulación y también el proceso de inicialización perezosa. Estoy seguro de que no necesita la vista en el mismo momento en que el controlador se está inicializando o viceversa. Si no, también puede la respuesta anterior en conjunción con la propiedad de init flojo para beans.

+1

No soy el póster original, pero ¿puedes mostrar un breve ejemplo de lo que quieres decir? ¡Gracias! –

+0

Bueno, lo que quería sugerirle era que, si la vista es necesaria después de inyectar el controlador, puede configurar la vista de la siguiente manera: Esto no requerirá que la vista se inicialice antes del controlador. – dharam

+0

¡Gracias por la actualización! –

5

No estoy seguro de qué tecnologías Java está utilizando, pero en las aplicaciones GWT, y utilizando el patrón MVP, no es necesario que la Vista tenga una referencia al controlador: toda la comunicación entre el controlador (o presentador)) y la Vista se realiza a través de una interfaz implementada por la Vista. En su caso particular, el código debería tener este aspecto:

definir un inteface Pantalla:

public interface Display { 
    public void registerEventListener(Listener aListener) 
    public List getSelectedFiles() 
} 

Deje que el Vista implementar la interfaz:

public class View implements Display{ 
//The method implementations 
} 

y hacer todos los enlaces necesarios en el Controlador:

public class Controller{ 
    private Display view; 
    public Controller(){ 
     //Or use some DI technology 
     this.view = new View(); 
     //Get a Listener implementation, maybe an Anonymous Inner Class 
     this.view.registerEventListener(getListener()); 
    } 

    public void processFiles(){ 
     List files = view.getSelectedFiles(); 
     //Do the processing here 
    } 

} 
0

Para vincular la vista y el controlador correctamente, haga clic derecho en * .asp x página y seleccione el menú "ir al controlador". Ahora, en el controlador respetado, agregue un método con la siguiente sintaxis.

public ActionResult viewName() 
{ 
    return view() 
} 

donde viewname es el nombre de su vista para ej. en .net es el nombre de la página sin extensión aspx Ahora cuando haga clic con el botón derecho en la vista y seleccione el menú "Ir a ver" que lo moverá a la página respetada, esto confirma que su vista y el controlador han sido bien enlazados.

Cuestiones relacionadas