2013-07-10 70 views
2

我有一個大組件。我們也可以認爲它是主要組成部分。這個組件應該包含一個子組件,它在我的情況下是一個抽象面板,並且它已經實現了自己的MVP。現在我正在實現MainComponent,因此我需要產生小型可重用抽象子組件的MVP。MVP產卵MVP子組件

我現在的問題是: 我應該在哪裏產生3個子部件中的每一個? 在模型中查看和演示者+模型? 在視圖中查看,主持人,主持人,模型中的模型?

在此先感謝您的意見!

MVP (with passive View)

+0

「我有一個大組件。」 - 那是因爲你的名字是雷神! –

回答

0

你不上你的具體的實施MVP的提供太多細節,但這裏是我關於這個問題的看法:

它有自己的MVP已經實施

我假設這意味着當視圖加載時(無論是主視圖還是子視圖),它已經與正確的演示者和模型連接起來了。我還假設,如果任何子演示者與主要演示者共享組件或服務,則這些由演進依賴注入框架解決。

如果我的假設是不正確的,那麼負責加載你的視圖的組件應該被更新以確保發生這種情況,即當視圖被加載時它是有效的。

我現在的問題是:我應該在哪裏產生3個子部件中的每一個?在模型中查看 和主持人+模型?在視圖中,主持人 演示者,模型中的模型?

根據我上面的評論,您應該有一個負責加載視圖並確保它們被正確配置的對象(讓我們稱這個對象爲ViewLoader)。這個對象只能從你的視圖層直接調用,即從來沒有從演示者調用。

雖然這個問題是演示者對象驅動應用程序,所以需要一種告訴視圖層加載另一個視圖的方式。您可以通過將視圖參考傳遞給演示者來解決此問題。認爲應該參考的是不暴露有關所使用的視圖技術的任何細節,例如一個接口來隱藏:然後

public interface IMainView 
{ 
    void OpenSettings(); 
} 

主講人可以調用OpenSettings()方法。該方法將通過一個具體的視圖類來實現,可能是這樣的:

public class MainView : UserControl, IMainView 
{ 
    public void OpenSettings() 
    { 
     var settingsView = viewLoader.Load(typeof(settingsView)); 
     this.tabControl.add(settingsView); 
    } 
} 

注意,實現該接口可以使用的ViewLoader加載視圖,以便它只有與插入到關注自身的實際具體視圖查看視圖層次結構(因爲ViewLoader提供了完全配置的視圖)。

還要注意IMainView接口描述了應用程序的行爲而不是實際的實現(即它被命名爲OpenSettings而不是OpenDialog)。這意味着如果視圖改變它打開設置視圖的方式(例如在對話框中顯示它),那麼只需要更新視圖;演示者不需要進行任何更改,因爲它仍會調用OpenSettings()方法來調用所需的行爲。

總結:

  • 主講呼籲視圖以驅動行爲的方法。
  • 視圖隱藏在界面後面以隱藏視圖技術的細節。
  • 視圖加載器負責加載視圖並將它們連接到它們的模型和演示者。
  • 視圖要求視圖加載器加載所需視圖並負責顯示返回的完全配置的視圖。