2012-06-02 217 views
8

我需要该视图来持有对控制器的引用,因为它需要将控制器注册为事件侦听器。 我需要控制器来保存对视图的引用,因为按下按钮后,我需要能够在列表中获取选定的文件。 (我有文件的列表,以及一个按钮“添加组”,所以当点击按钮时,我需要得到所选文件)MVC - 循环依赖

因此,在短期我:

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

我敢肯定,这里有一些不好的设计,我只是无法弄清楚如何避免它..

+0

作为[Swing的确](http://www.oracle.com/technetwork/java/architecture-142923.html)并结合Controller和View。 – Jeffrey

+0

我会反对在MVC中这样做,因为我记得它并不是真正用于服务器端事件处理。也许用jQuery处理事件在这里会更合适。 – Lilienthal

回答

3

一个可能的解决方案:

  • 时,只需提供控制器的addView(View view)方法
  • 同样,查看给它一个addController(Controller controller)方法。
  • 使它成为您的文档的一部分,这些必须在使用之前设置。
  • 请确保在使用它们之前检查引用变量是否为空,因为它们不会在构造函数中设置。
+0

谢谢。我想到了它,但不确定它是否正确。 – Shmoopy

+0

我很确定视图不应该依赖于MVC模式上的Controller:它只能依赖于模型 –

+0

您建议视图应该有一个对Controller的引用:这是一个依赖关系 –

1

那么,我相信你可以使用封装,也懒惰的初始化过程。我相信,当控制器初始化时,您不需要视图,反之亦然。如果没有,你也可以将上面的答案与bean的lazy init属性结合起来。

+1

我不是原始的海报,但你能展示一下你的意思吗?谢谢! –

+0

那么我想建议他是,如果在控制器注入后需要视图,那么他可以配置视图如下: 这不需要在控制器之前初始化视图。 – dharam

+0

感谢您的更新! –

5

我不确定您使用的是哪种Java技术,但是在GWT应用程序中(并且使用MVP模式),不需要View对Controller进行引用:Controller(或Presenter )和视图是通过由视图实现的界面进行的。在您的特定情况下,你的代码应该是这样的:

定义显示inteface:

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

让观实现该接口:

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

,并在所有必要的绑定控制器:

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

要正确绑定视图和控制器,请右键单击* .asp x页面并选择“进入控制器”菜单。现在在相应的控制器中添加一个使用以下语法的方法。

public ActionResult viewName() 
{ 
    return view() 
} 

其中viewname是您的视图的名称,例如。在.net它是没有aspx扩展名的页面现在,当你右键点击视图并选择菜单“Go to view”,这会将你移动到受尊敬的页面,这确认了你的视图和控制器已被绑定好。