2009-01-09 73 views
12

我有一些樂趣,試圖讓我的頭在一些MVP stuf,因爲它涉及到用戶控件。我正在使用.NET WinForms(或與之相近的東西)和Supervising Controller模式(嗯,我想我是:)。MVP和UserControls和調用

用戶控件本身是MVP應用程序的一部分(其視圖和關聯的Presenter等)。演示者始終首先啓動,然後啓動模型然後查看視圖。該視圖建立其用戶界面,其中的一部分將是新的UC,這是視圖。

現在,(表單)演示者需要了解UC Presenter,但我認爲它不知道視圖是如何組成的。舉例來說,Presenter並不知道UC是表單控件集合的一部分,也不應該。

此外,設計經驗不應改變; IOW View(窗體)的開發者應該能夠從工具箱中選擇一個用戶控件並將其放在窗體上。

所以,在我的問題。首先,我的假設是否正確?有點誤導?弄亂? WTF你在想什麼?

其次,是否有正確的(足夠?)使窗體視圖調用UC視圖,並且窗體Presenter調用UC Presenter並且有一些機制來告訴UC View它的Presenter是什麼?這打破了我的「演示者第一」規則,但我不知道該怎麼做。

任何其他的想法,建議,評論欣然接受。

- nwahmaet

回答

12

演示者應該被認爲是表示層中的「自治狀態」。這意味着它有責任確保視圖對模型狀態的呈現是同步的。我之所以提出這個問題,是因爲MVP的「模式」經常在教條式的觀點0123中如何分開。似乎這是Martin Fowler決定嘗試clarify the terminology around the MVP模式的原因之一。

我最喜歡的MVP的味道是passive view,所以我的答案是基於此。

我使用被動視圖模式經常實現複合用戶控件和窗體。基本上有3種不同的配置:

  1. 層次結構中所有用戶控件的一個主持人。使用界面展平視圖。
  2. 複合樹中每個用戶控件的一個主持人。每位家長演示者負責實例化並初始化其小孩演示者。用戶控件是在設計時創建的,並且能夠在沒有演示者的情況下運行(沒有演示文稿行爲)
  3. 複合樹中每個用戶控件的一個演示者。所有的演講者都是通過更高層次的控制器類來鬆散耦合的。控制器類負責構建演示者,連線並協調他們的事件。

雖然這是對我來說最後一招(因爲它的複雜性)的解決方案,我認爲最後的選擇是您正在尋找的解決方案。

0

您的問題是普遍認爲多種方案可以適用。

在這種情況下,我的猜測是你應該看Observer Pattern。

你有一個接口,任何使用該視圖的實現。然後,它會在應用程序使用這些接口的集合進行初始化時註冊自身。任何需要更新該視圖的命令都會遍歷集合,通知每個視圖都應該更新。

與典型示例不同,視圖將是用戶控件。您可以靈活地使任何UI元素都能實現該界面,因此除了用戶控件之外,您還可以使用對話框,完整表單等。

最後請記住,用戶控件不是視圖,而是視圖的實現。無論您採用什麼方案,您都可以定義視圖的深度,並讓用戶控件實現該界面。

4

我在一個應用程序中工作了幾個月,一直在解決這個問題。我最近得出的結論是,在很多情況下,不可能在窗口和用戶控制級別應用MVP模式,也不能「破壞」模式。

我的想法是,用戶控件是視圖實現的一部分,並且演示者不應該知道視圖實現內部發生了什麼,這意味着窗口級別的演示者通過擴展應該不知道用戶控制的主持人,因此它們之間不應該有任何溝通,包括前者對後者的實例化。可能會認爲用戶控件的演示者是窗口視圖實現的一部分,因此窗口視圖可能會實例化用戶控件演示者。但它不能注入演示者需要的模型類,因爲視圖不應該意識到它們。

我認爲我得出的結論是,所有用戶控件都是特定於視圖實現的,因此應該完全包含在較大模式的視圖中。因此,他們不必擁有自己的演示者......至少不會與控制實施本身捆綁在一起。相反,它們應該由父窗口的演示者通過視圖界面上公開的傳遞字段間接操縱。簡而言之,用戶控件不是通過自己的接口暴露給演示者,而是通過其父視圖實現的通用傳遞接口。稱此爲「局部視圖界面」。

然後,您的演示者可以包含可重用的子演示者類的實例,該類只能與此部分視圖界面和模型的相關部分一起使用。這將允許您避免重寫每次需要使用控件時從模型進行翻譯的演示者代碼,並且阻止窗口視圖需要了解模型,以便將信息傳遞給控件的演示者。

這樣做的效果是將用戶控件作爲模塊從數據模型中進一步分離出來。如果將用戶控件作爲整體考慮爲視圖實現的一個元素,這是有道理的。作爲一個可重用的單元,它是一個視圖功能,並且它的任何部分都不應該綁定到您的數據模型。

+1

我同意所有的UC都是特定於實現的視圖,但是也認爲他們需要他們自己的演示者或模型,具體取決於UC的意圖。導航面板可能具有Presenter邏輯而不是模型;一個郵政編碼肯定查找需要一個模型。 – nwahmaet 2009-01-20 16:36:35

+1

我明白你的觀點。我的感覺是,儘可能避免將自定義控件綁定到模型上。像這樣綁定到您的應用程序體系結構中的控件我稱之爲「胖」控件。它們就像迷你的子窗戶一樣,在保持設計清潔/簡單的同時很難處理。 – 2009-01-22 15:29:58