我们将如何在Windows Forms应用程序中实现MVC?

时间:2020-03-06 14:36:45  来源:igfitidea点击:

我没有开发太多的桌面/ Windows Forms应用程序,但是我想到使用MVC(模型视图控制器)模式进行Windows Forms .NET开发可能会有一些好处。

有没有人在Windows窗体中实现MVC?如果是这样,我们对设计有什么建议吗?

解决方案

好吧,实际上Windows窗体实现了MVC的"自由样式"版本,就像某些电影对某些经典书籍实现了一些cr脚的"自由样式"解释一样(想到了罗密欧与朱丽叶)。

我并不是说Windows窗体的实现很糟糕,只是...与众不同。

如果我们使用Windows窗体和适当的OOP技术,以及可能使用诸如EntitySpaces之类的ORM进行数据库访问,那么我们可以这样说:

  • ORM / OOP基础结构是模型
  • 表单就是视图
  • 事件处理程序是控制器

尽管将View和Controller都用同一个对象表示,会使代码与表示方式的分离变得更加困难(在从Microsoft.Windows.Forms.Form派生的类中插入" GTK +视图"并不容易)。

如果我们足够小心,该怎么办。通过仅在事件处理程序中编写与GUI相关的内容,并在单独的类中编写所有其他业务逻辑,来使表单代码与控制器/模型代码完全分开。在这种情况下,如果我们想使用GTK +编写另一个View层,则只需重写GUI代码。

签入用户界面进程(UIP)应用程序块。我对此了解不多,但几年前已经看过了。可能有较新的版本,请查看。

" UIP应用程序块基于模型视图控制器(MVC)模式。"

Windows窗体并不是为使用MVC而设计的。我们有两个选择。

首先,我们可以滚动自己的MVC实现。
其次,我们可以使用为Windows窗体设计的MVC框架。

首先很容易开始做,但是越深入,就越复杂。我建议我们寻找一个旨在与Windows Forms一起使用的良好,预先存在且经过测试的MVC框架。我相信这篇博客文章是一个不错的起点。

对于刚起步的任何人,如果我们可以选择的话,建议我们跳过Windows窗体并针对WPF进行开发。这是用于创建UI的更好的框架。为WPF开发了许多MVC框架,包括该框架和该框架。

我过去做过的事情是使用类似的Model-View-Presenter。

[注意:这篇文章以前可以在网上获得。要立即查看,我们需要下载CHM,然后查看文件属性并单击"取消阻止"。然后,我们可以打开CHM并找到该文章。谢谢百万,微软!叹]

表单就是视图,我有一个IView接口。所有处理都在演示者中进行,这只是一个类。该表单将创建一个新的演示者,并将自身作为演示者的IView传递。通过这种测试方式,我们可以传递一个伪造的IView,然后从演示者向其发送命令并检测结果。

如果我要使用成熟的Model-View-Controller,我想我会这样做:

  • 表单就是视图。它向模型发送命令,引发控制器可以订阅的事件,并订阅来自模型的事件。
  • 控制器是一个类,它订阅视图的事件并将命令发送到视图和模型。
  • 该模型引发视图订阅的事件。

这将符合经典的MVC图。最大的缺点是,通过事件,很难分辨出谁在订阅什么。 MVP模式使用方法而不是事件(至少是我实现它的方式)。当表单/视图引发事件(例如someButton.Click)时,表单仅在演示者上调用一个方法来为其运行逻辑。视图和模型根本没有任何直接联系;他们俩都必须经过主持人。

看看MS Patterns and Practices Smart Client应用程序块,它具有一些指导和类,它们将引导我们逐步完成Windows窗体中的模型视图演示者模式,并查看其中包含的参考应用程序。

对于WPF,这已由棱镜项目取代

软件工厂方法是学习最佳实践的好方法

根据Microsoft的说法,@ jasonbunting提到的UIP应用程序块已"存档"。相反,请查看Smart Client Application Block或者更新的Smart Client Software Factory,后者同时支持WinForms和WPF SmartParts。