你将如何在Windows窗体应用程序中实现MVC?

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

有没有人在Windows窗体中实现MVC? 如果是这样,你有任何关于devise的提示吗?

我过去所做的是使用类似于模型 – 视图 – 演示者的东西 。

[注:这篇文章曾经在网上提供。 要现在看到它,您需要下载CHM,然后查看文件属性并单击Unblock。 然后你可以打开CHM并find文章。 微软万分感谢! 叹气 ]

窗体是视图,我有一个IView接口。 所有的处理都发生在主持人,这只是一个阶级。 表格创build一个新的主持人,并作为主持人的视点自传。 通过这种方式进行testing,您可以传递一个伪造的IView,然后从演示者向它发送命令并检测结果。

如果我要使用一个完整的模型 – 视图 – 控制器,我想我会这样做:

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

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

那么,实际上Windows Forms实现了一个“自由风格”的MVC版本,就像一些电影实现了一些经典书籍(罗密欧与朱丽叶想到)的蹩脚的“自由风格”的诠释。

我不是说Windows窗体的实现是坏的,只是…不同而已。

如果您使用Windows窗体和适当的OOP技术,并且可能使用像EntitySpaces这样的ORM来访问数据库,那么您可以这样说:

  1. ORM / OOP基础架构就是这个模型
  2. 表格是视图
  3. 事件处理程序是Controller

尽pipe同一个对象代表的View和Controller使代码与表示forms分离变得更加困难(在从Microsoft.Windows.Forms.Form派生的类中,没有简单的方法来插入“GTK +视图”)。

你可以做什么,如果你足够小心。 通过在事件处理程序中编写与GUI相关的东西,以及在单独的类中编写所有其他业务逻辑,使您的表单代码与控制器/模型代码完全分离。 在这种情况下,如果您想要使用GTK +编写另一个View层,则只需要重写GUI代码即可。

Windows窗体不是从头开始devise使用MVC。 你有两个select。

首先,你可以推出自己的MVC实现。

其次,您可以使用为Windows Formsdevise的MVC框架。

第一个是开始做起来很简单,但是越深入,越复杂。 我build议寻找一个良好的,预先存在和经过充分testing的MVC框架,旨在与Windows窗体一起工作。 我相信这篇博文是一个体面的起点。

对于任何人开始,我会build议跳过Windows窗体和WPF开发,如果你有select。 这是一个更好的创buildUI的框架。 有很多MVC框架正在为WPF开发,包括这一个和那个 。

根据微软的说法,@jasonbunting提到的UIP应用程序块是“归档的”。 相反,请查看智能客户端应用程序块或更新的智能客户端软件工厂 ,它支持WinForms和WPF SmartParts。

检入用户界面过程(UIP)应用程序块 。 我不太了解,但几年前就看了。 可能有更新的版本,检查周围。

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

看看MS模式和实践智能客户端应用程序块,它具有一些指导和类,可以引导您在Windows窗体中实现模型视图演示者模式 – 请参阅包含的参考应用程序。

对于WPF来说,它正在被棱镜项目所取代

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