MVC - 循环依赖

时间:2012-06-02 19:29:05

标签: java model-view-controller circular-dependency

我需要视图来保存对控制器的引用,因为它需要将控制器注册为事件监听器。 我需要控制器来保存对视图的引用,因为在按钮单击时,我需要能够在列表中获取所选文件。 (我有一个文件列表和一个按钮'添加群集',所以当点击按钮时我需要获取所选文件)

所以总之我有:

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

我确定这里有一些不好的设计,我只是想不通如何避免它..

5 个答案:

答案 0 :(得分:5)

我不确定您使用的Java技术,但在GWT应用程序中 - 并且使用MVP模式 - 不需要View来引用Controller:Controller(或Presenter)之间的所有通信View是通过View实现的接口完成的。在您的特定情况下,您的代码应如下所示:

定义显示界面:

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

让View实现该接口:

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
    }

}

答案 1 :(得分:3)

一种可能的解决方案:

  • 只需向Controller提供addView(View view)方法
  • 即可
  • 同样,View为其提供addController(Controller controller)方法。
  • 将其作为文档的一部分,必须在使用前进行设置。
  • 确保在使用之前检查引用变量是否为null,因为它们不会在构造函数中设置。

答案 2 :(得分:1)

好吧,我相信你可以使用封装和懒惰的初始化过程。我确信你在控制器初始化的同一时刻不需要View,反之亦然。如果不是,你也可以将上面的答案与bean的lazy init属性结合起来。

答案 3 :(得分:0)

要正确绑定视图和控制器,请右键单击* .aspx页面并选择“转到控制器”菜单。现在在受尊敬的控制器中添加一个具有以下语法的方法。

public ActionResult viewName()
{
   return view()
}  

其中viewname是ex的视图名称。在.net中它是没有aspx扩展名的页面名称现在,当您右键单击视图并选择菜单“Go to view”将移动到尊重页面时,这确认您已查看并且控制器已绑定好。

答案 4 :(得分:0)

创建四个部分: 一控 2模型 3视图 4-ViewInterface

第4节是“控件”和“视图”之间的中间层。 初始化View时,初始化

之类的IControl接口
IControl control = new ControlUtil((IViewUtil(new ViewUtil());

您通过视图界面来使用控件。 当视图要调用控件时,就像在说:“嘿,控件要做一些事情,这是我的界面,以备不时之需。