2012-03-18 85 views
18

我有一個關於如何使用MVP時,處理主持人之間的通信問題。假設我有兩個MVP三人組。一個是產品列表(三元組A),另一個是關於當前選擇的產品(三元組B)的一些一般信息。演示者之間的MVP通信?

如何告訴Presenter B它需要更新,因爲所選產品已由A更改?我當然可以想辦法做到這一點,但我想知道是否有一個通用的慣例來處理這個問題。

在此先感謝您的任何想法!

回答

12

模式本身並沒有真正規定如何處理這個問題。

我自己的偏好是一個消息/事件中心,演示者可以在某些事件中註冊興趣。它可以防止複雜的依賴樹,並保持演示者的可測試性。

例如:

class PresenterA 
{ 
    void HandleProductSelectionChanged(int productId) 
    { 
     EventHub.Publish(EventType.ProductChanged, productId); 
    } 
} 

class PresenterB 
{ 
    void PresenterB 
    { 
     EventHub.Register(EventType.ProductChanged, HandleProductChanged); 
    } 

    public void HandleProductChanged(object state) 
    { 
     var productId = (int)state; 
     var productDetails = LoadProductDetails(productId); 
     view.DisplayProductDetails(productDetails); 
    } 
} 

EventHub將保留用戶的列表來調用每個事件的類型。

您保留可測試性 - 只需撥打HandleProductChanged即可瞭解PresenterB如何響應新產品選擇。

唯一的缺點(與任何圖案)是你介紹了一個間接層。如果PresenterA直接調用PresenterB,或者PresenterB聽到PresenterA上的事件,那麼很明顯會發生什麼事情。

在這種方法中,您可以通過額外的步驟查看EventType.ProductChanged,然後查找哪些演示者在該事件中註冊了興趣。

在我自己的經驗,間接的是單級是值得模塊化你。

+1

這正是我一直在尋找,看起來比周圍路過主持人引用好多了。當我不累的時候,我明天會看看這個。謝謝。 – user1277327 2012-03-19 00:47:36

1

個人我不同意的方式有很多人選擇事件總線來解決這類問題

這是我很難想象的情況下,當兩個主持人需要互相溝通,你可以提供一個真實的案例?

在我看來,如果兩位演示者需要相互溝通,那麼您應該將這兩者合併爲一個演示者。請記住,模型對象在兩個用例之間的交流也是業務邏輯,因此主講者的範圍可能比您想象的要大。

請考慮一下,如果您以正確的方式使用協作者,那麼您不需要演示者之間的通信。數據應由合作者提供。

+0

嗨,你可以點亮一下模型與演示者之間的溝通方式,以便演示者可以在視圖上執行一些操作。對於例如,比如說,讀取數據庫中的模型做的話,應該如何建模告訴主持人,它已經讀取數據並將數據傳回主持人,這樣主持人可以更新視圖。 – eRaisedToX 2017-05-25 06:18:32

+0

「數據庫讀取在模型中完成」... naat XD ...我更願意創建一個交互器。 – 2017-05-30 13:09:35