MVP和UserControls和调用

时间:2009-01-09 20:04:20

标签: winforms design-patterns user-interface mvp

我正在试图了解一些MVP stuf,因为它与用户控件有关。我正在使用.NET WinForms(或接近它的东西)和监督控制器模式(好吧,我想我:)。

用户控件本身是MVP应用程序的一部分(它的View和一个关联的Presenter等)。 Presenter始终首先启动,然后启动模型,然后启动View(s)。 View构建其UI,其中一部分将是新的UC,即View。

现在(表单)Presenter需要了解UC Presenter,但我认为它对View的组成方式一无所知。例如,Presenter表格不知道UC是表格的控件集合的一部分,也不应该。“/ p>

此外,不应改变设计经验; Iow视图(表单)的开发应该只能从工具箱中选择一个用户控件并将其放在表单上。

所以,关于我的问题。首先,我的假设是否正确?有点误导?弄乱? WTF你在想什么?

其次,是否正确(足够?)使表单View调用UC视图,表单Presenter调用UC Presenter并有一些机制告诉UC查看它的Presenter是什么?这打破了我的“Presenter first”规则,但我不确定如何做到这一点。

任何其他想法,建议,评论都很乐意接受。

- nwahmaet

3 个答案:

答案 0 :(得分:13)

演示者应该被认为是表示层中的“自治状态”。这意味着它负责确保视图的模型状态呈现是同步的。我提出这个问题的原因是因为MVP的“模式”经常在如何事物应该被分离的教条主义观点中迷失。这似乎是马丁福勒决定尝试clarify the terminology around the MVP模式的一个原因。

我最喜欢的MVP风格是passive view,所以我的回答是基于此。

我经常使用被动视图模式实现复合用户控件和表单。基本上有3种不同的配置:

  1. 层次结构中所有用户控件的一个演示者。使用界面展平视图。
  2. 复合树中每个用户控件的一个演示者。每个父演示者负责实例化和初始化其子演示者。用户控件是在设计时创建的,并且能够在没有演示者的情况下运行(没有演示行为)
  3. 复合树中每个用户控件的一个演示者。所有演示者都通过更高级别的控制器类松散耦合。控制器类负责构建演示者,连接它们并协调它们的事件。
  4. 虽然这对我来说是最后的解决方案(因为它的复杂性),但我认为最后一个选项是您正在寻找的解决方案。

答案 1 :(得分:4)

在我正在开发的应用程序中,我已经在几个月内遇到了这个问题。我最近得出的结论是,在许多情况下,可能无法在窗口和用户控制级别应用MVP模式,而不会“破坏”模式。

我的想法是用户控件是视图实现的一部分,并且演示者不应该知道视图实现中发生了什么,这意味着扩展的窗口级演示者不应该知道用户控制的主持人,因此他们之间不应该有任何沟通,包括前者对后者的实例化。可能有人认为用户控件的演示者是窗口视图实现的一部分,因此窗口视图可以实例化用户控件演示者。但是它不能注入演示者需要的模型类,因为视图不应该知道它们。

我认为我得出的结论是,所有用户控件都是特定于视图实现的,因此应该完全包含在较大模式的视图库中。因此,他们没有自己的演示者......至少没有捆绑控制实现本身。相反,它们应该由父窗口的演示者通过视图界面上公开的传递字段间接操作。简而言之,用户控件不是通过其自己的接口向展示者公开,而是通过其父视图实现的公共传递接口公开。将其称为“部分视图界面”。

然后,您的演示者可以包含可重复使用的子演示者类的实例,该类仅适用于此部分视图界面以及模型的相关部分。这将允许您避免重新编写演示者代码以在每次需要使用控件时从模型转换,并且它可以防止窗口视图需要知道模型以便将信息传递给控件的演示者。

这有效地做了什么,它进一步将用户控件(作为模块)与数据模型分开。如果您将用户控件作为一个整体视为视图实现的一个元素,那么这是有意义的。作为一个可重复使用的单元,它是一个视图功能,并且它的任何部分都不应该与您的数据模型相关联。

答案 2 :(得分:0)

您的问题很普遍,可以采用各种方案。

在这种情况下,我的猜测是你应该看一下观察者模式。

您有一个界面,任何使用该视图的东西都会实现。然后,当应用程序使用这些接口的集合初始化时,它将注册自己。任何需要更新该视图的命令都会遍历集合,通知每个视图都应该更新。

与典型示例不同,视图是用户控件。您可以灵活地使任何UI元素实现该接口,这样除了用户控件之外,您还可以使用对话框,完整表单等。

最后记住用户控件不是视图而是View的实现。无论您采用何种方案,您都可以根据需要定义View,并让User Control实现该接口。

相关问题