Winforms 主持人之间的MVP沟通?

Winforms 主持人之间的MVP沟通?,winforms,mvp,Winforms,Mvp,我有一个问题,关于使用MVP时如何处理演示者之间的沟通。假设我有两个MVP三位一体。一个是产品列表(Triad a),另一个是关于当前所选产品的一些一般信息(Triad B) 我如何告诉演示者B它需要更新,因为所选产品已由A更改?我当然可以想办法做到这一点,但我想知道是否有一个关于如何处理这一问题的一般惯例 提前感谢您的任何想法 模式本身并没有规定如何处理这个问题 我自己的偏好是一个消息/事件中心,在这里,演示者可以注册对某些事件的兴趣。它防止了复杂的依赖树,并使演示者保持可测试性 例如: cl

我有一个问题,关于使用MVP时如何处理演示者之间的沟通。假设我有两个MVP三位一体。一个是产品列表(Triad a),另一个是关于当前所选产品的一些一般信息(Triad B)

我如何告诉演示者B它需要更新,因为所选产品已由A更改?我当然可以想办法做到这一点,但我想知道是否有一个关于如何处理这一问题的一般惯例


提前感谢您的任何想法

模式本身并没有规定如何处理这个问题

我自己的偏好是一个消息/事件中心,在这里,演示者可以注册对某些事件的兴趣。它防止了复杂的依赖树,并使演示者保持可测试性

例如:

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,然后查找哪些演示者对该事件感兴趣


根据我自己的经验,这种单一层次的间接性非常值得模块化。

就我个人而言,我不同意许多人选择事件总线来解决此类问题的方式

我很难想象两位演讲者需要相互交流的情况,你能提供一个真实的案例吗

在我看来,如果两个演讲者需要相互交流,那么你应该将这两个演讲者合并到一个演讲者中。请记住,两个用例之间的模型对象通信也是业务逻辑,因此演示者的范围可能比您最初想象的要大


还要考虑,如果您以正确的方式使用协作者,那么您不需要演示者之间的沟通。数据应该由合作者提供。

我想补充一下我的观点,附带一个移动开发背景

在我看来,您正在处理一个典型的主从场景。我的建议是,尽管这些容器A和B有自己的演示者,因为很明显,它们可能有自己的实现范围,需要以一种干净的方式进行处理,但它们不应该直接相互交谈。他们可能没有彼此而生活。然而,如果有一种方法可以同时呈现它们,那就是通过一个更大的容器来处理它们。这是解决你问题的关键

声明通知容器A/B更改的接口。在更大的容器(让我们称之为主机)中实现它们,并创建一个侦听器来表示绑定通信的接口

每当容器a发生变化时,它会通过接口通知主机,主机会将事件传递给它自己的演示者,演示者可以运行更大范围的操作,如存储状态或将分析事件发送到后端,最后它会告诉主机更新从机,从机会向容器B提供要更新的数据


使用事件的解决方案可能非常诱人,我自己也做过很多次,但它是有代价的。如果你滥用它,你只会增加技术债务。我建议在“事件”不一定与任何特定处理场景绑定,但可能成为项目中其他模块的兴趣点的情况下使用此机制。

这正是我想要的,看起来比传递演示者引用要好得多。明天我不那么累的时候再看这个。谢谢。您好,您能告诉我们一个人应该如何在模型和演示者之间进行沟通,以便演示者能够在视图上执行一些操作吗。例如,假设数据库读取是在模型中完成的,那么模型应该如何告诉演示者它已经读取了数据并将数据传递回演示者,以便演示者可以更新视图。“数据库读取是在模型中完成的”。。。naat XD。。。我更喜欢创建一个交互者。