2012-06-02 214 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」,這會將你移動到受尊敬的頁面,這確認了你的視圖和控制器已被綁定好。