我是否正确实现了MVP / Presentation Model UI模式?

时间:2010-08-08 19:49:02

标签: .net winforms mvp presentation-model

我正在重新使用Winforms应用程序,并希望为UI使用Presentation Model pattern的变体。如果我正确地做了,有人可以从以下解释中告诉我吗?


我决定按如下方式设置依赖项:

   Model <---- Presentation Model <---- View

那是:

  • 除了自身之外,模型不知道任何事情。

  • 演示模型引用了模型(但反之亦然)。

  • 该视图引用了演示模型(但反之亦然)。

我正在使用Winforms数据绑定来保持视图和表示模型的同步。

现在这一切都像魅力一样,除非我需要处理例如单击表单的“关闭”按钮。由于表示模型没有引用视图,因此无法订阅视图发布的任何事件。因此,我想出了以下拐杖:

Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+

那是:

  • 用户点击“关闭”按钮。

  • 在视图中捕获按钮的Click事件,该事件通过设置属性CloseRequested作出反应。

  • 数据绑定将此值传输到演示模型中的相应属性。

  • 演示模型通过设置其属性IsClosed来对此更改做出反应。

  • 数据绑定将此值传输到视图的MustClose

  • 视图通过关闭自身来对此更改作出反应。

演示模型很好地与视图分离,反之亦然,但这只是处理单个按钮命令的很多工作。考虑到我决定使用的依赖图,是否有更简单的方法?

3 个答案:

答案 0 :(得分:2)

我最近将Windows窗体应用程序转换为MVP架构,看起来您已经以与我一直在做的方式类似的方式设置了依赖关系。但是,我只有一个IPresenter接口,它定义了允许视图传递用户请求的方法。由于视图已经依赖于演示者及其引用,因此直接在其上调用请求方法似乎是明智的。

因此,在我的系统中,演示者会监听模型中的事件并为任何感兴趣的视图触发自己的演示事件以进行监听。视图通过适当更新自身来响应这些事件,并在制作时将用户请求转发给演示者。

答案 1 :(得分:1)

这只是我的意见。

使用演示模型需要100%的UI支持数据绑定。甚至WPF都不会将CLOSE操作作为Bindable。在MessageBox Confirmation等演示模型中,很多东西都不能顺利运行。即使它可以使用Presenter界面进行抽象,但仍然没有好吃,简单性也被牺牲了。

另一方面,演示模型的主要目的是测试视图逻辑。在某些情况下,如果您的“关闭操作”应该进行单元测试,因为在它关闭之前有一些逻辑,那么您的代码是唯一的选择。但如果它只是一个简单的确认“你确定要退出”那么你最好把它放在View not in presentation模型中,因为它不需要进行单元测试。

答案 2 :(得分:0)

  

该视图引用了   演示模型(但不是副作用)   亦然)。

AFAIK演示应该有一个参考,以更准确地查看界面IView,以便演示文稿不与具体视图耦合。然后在表示类中,您可以调用视图方法并通过IView订阅查看事件。