【问题标题】:MVP: 3rd party controls, How much logic can be put in View layerMVP: 3rd party controls, View layer可以放多少逻辑
【发布时间】:2010-12-29 09:59:51
【问题描述】:

我正在学习MVP模式,但仍有一些疑问。

Martin Hunter 在他的 MVC/MVP 概述中写道:

在 MVP 中,视图变成了一个超薄的组件,其目的纯粹是为用户提供演示。视图捕获并处理用户提出的事件,但将这些事件直接转发给知道如何处理它们的演示者。

(...)

但是,使用 MVP,视图会捕获引发的事件并将它们转发给控制器(演示者)

这对按钮和文本框来说很好,但是如果有一些更复杂的控件呢?假设我正在使用第 3 方组件,例如 Devexpress 的 TreeList 控件。假设我想在用户单击展开按钮“+”时动态构建子节点。不使用任何模式我可以这样编码:

private void BeforeExpand_EventHandler(object sender, BeforeExpandEventArgs e)
{
    TreeList treeList = sender as TreeList;
    MyModelObject nodeObj = e.Node.Tag as MyModelObject;

    treeList.BeginUnboundLoad();
        
    //Create sub-nodes depending on nodeObj 

    treeList.EndUnboundLoad();
}

如您所见,有一些视图对象,例如 BeforeExpandEventArgs、TreeListNode,以及一些特定的操作,例如 BeginUnboundLoad(),等等。在这种情况下,我的视图层不能“超薄”。我不能直接传递给像 BeforeExpandEventArgs 这样的 Presenter 对象,因为它会通过一些 View 东西影响 Presenter。

那么我的问题是:我可以在视图层中放入多少逻辑?比如下面的代码可以吗?

private void BeforeExpand_EventHandler(object sender, BeforeExpandEventArgs e)
{
    TreeList treeList = sender as TreeList;
    MyModelObject nodeObj = e.Node.Tag as MyModelObject;

    treeList.BeginUnboundLoad();
        
    e.Node.Nodes = this.presenter.GetNodes(nodeObj);

    treeList.EndUnboundLoad();
}

【问题讨论】:

    标签: c# .net winforms design-patterns mvp


    【解决方案1】:
    1. 我认为 View 负责处理这个问题。MVP(MVC) 的想法是您可以切换到其他 View 而无需更改 Model & Presenter 至少在理论上 ;)。这样视图逻辑就可以像您一样留在视图层。
    2. 在您的示例中我不同意的一点是对 Presenter 的引用。您应该做相反的事情。演示者必须引用 View 以及 Model 对象。在这种情况下,View 调用 Presenter 已经监听的事件,Presenter 将节点数组返回给 View。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 1970-01-01
      • 2018-08-29
      • 1970-01-01
      • 2010-10-06
      相关资源
      最近更新 更多