我们将如何在Windows Forms应用程序中实现MVC?
我没有开发太多的桌面/ 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。