2012-03-18 56 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