.net 我是否正确地实现了MVP/表示模型UI模式?

.net 我是否正确地实现了MVP/表示模型UI模式?,.net,winforms,mvp,presentation-model,.net,Winforms,Mvp,Presentation Model,我正在处理一个Winforms应用程序,希望为UI使用一个变体。有人能从下面的解释中告诉我我做得是否正确吗 我已决定按如下方式设置依赖项: Model <---- Presentation Model <---- View Model我最近一直在将一个Windows窗体应用程序转换为MVP体系结构,看起来您的依赖项设置方式与我所做的类似。然而,我只是有一个IPresenter接口,它定义了允许视图传递用户请求的方法。由于视图已经依赖于presenter和对它的引用,因此直接

我正在处理一个Winforms应用程序,希望为UI使用一个变体。有人能从下面的解释中告诉我我做得是否正确吗


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

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

Model我最近一直在将一个Windows窗体应用程序转换为MVP体系结构,看起来您的依赖项设置方式与我所做的类似。然而,我只是有一个
IPresenter
接口,它定义了允许视图传递用户请求的方法。由于视图已经依赖于presenter和对它的引用,因此直接对其调用请求方法似乎是明智的

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

该视图引用了 演示模型(但不是相反) 反之亦然)

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

这只是我的观点

使用表示模型需要100%的UI支持数据绑定。即使是WPF也不能使关闭操作成为可绑定的。在表示模型中,很多事情都无法顺利进行,例如MessageBox确认。即使它可以用Presenter界面抽象出来,但仍然不好吃,牺牲了简单性


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

MVP有很多变化,我已经看到了这两种方法。在您描述的方法中,演示者将同时依赖于模型和IView。此外,所有视图都需要实现所有IView方法,即使是它们不处理或不关心的方法。在这种方法中,演示者仅依赖于模型,视图仅依赖于演示者。否,演示模型与MPV不同。Thread Starter是正确的演示模型不应该引用UI,因为它应该很容易进行单元测试。@在我写Presenter时,ktutnik引用了IView接口,而不是视图控件,因此可以对Presenter类进行单元测试。是的,我看到了,您在MVP上下文中是正确的!,但是对于Martin's Fowler,表示模型只包括视图、表示模型和模型,表示模型不同于表示者,表示模型通过数据绑定通知更新视图,而不是直接更新视图。对用户界面的引用是不允许的,因为它是模型的演变我知道Winforms中的数据绑定并不完美。(例如,它只适用于UI控件,不适用于POCO。而且,顾名思义,它只支持属性,不支持事件。)但这真的是在Winforms中实现MVP模式的根本问题吗?是的!因为基本原则是有约束力的。在WPF中,它被称为MVVM(模型-视图-视图模型),而AdobeFlex则被称为(表示模型)。您可以尝试搜索对话框确认mvvm或flex验证演示模型,您将看到演示模型模式带来的麻烦比清晰度更大。我并不是说这是一个糟糕的模式,但要让它100%工作,它需要100%的数据绑定视图支持。请记住,MVP和演示模式不同,请看
Presentation Model                   View
+--+                                 +--+
|  |                                 |  |
|  |                                 | <--------X closeButton.Click event fires
|  |                                 |  |
|  |                         +--------X |
|  |   CloseRequested = true |       |  | 
|  |                         +--------> |
|  |                                 |  |
|  | CloseRequested   CloseRequested |  |
| <-----------------------------------< |
|  |                                 |  |
| X--------+                         |  |
|  |       | IsClosed = true         |  |
| <--------+                         |  |
|  |                                 |  |
|  | IsClosed              MustClose |  |
| >-----------------------------------> |
|  |                                 |  |
|  |                                 | X--------> view.Close()
|  |                                 |  |
+--+                                 +--+