68

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

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

4

6 回答 6

44

我过去所做的是使用类似的东西Mo​​del-View-Presenter

[注意:这篇文章曾经可以在网络上找到。要立即查看,您需要下载 CHM,然后查看文件属性并单击取消阻止。然后您可以打开 CHM 并找到该文章。感谢一百万,微软! 叹息]

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

如果我要使用成熟的模型-视图-控制器,我想我会这样做:

  • 形式就是视图。它向模型发送命令,引发控制器可以订阅的事件,并从模型订阅事件。
  • 控制器是一个订阅视图事件并向视图和模型发送命令的类。
  • 模型引发视图订阅的事件。

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

于 2008-09-23T17:45:42.810 回答
19

好吧,实际上 Windows 窗体实现了 MVC 的“自由风格”版本,就像一些电影实现了一些经典书籍的一些蹩脚的“自由风格”解释(我想到了罗密欧与朱丽叶)。

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

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

  1. ORM/OOP 基础设施是模型
  2. 形式就是观点
  3. 事件处理程序是控制器

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

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

于 2008-09-23T17:28:22.243 回答
17

Windows 窗体并非从一开始就设计为使用 MVC。你有两个选择。

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

其次,您可以使用为 Windows 窗体设计的 MVC 框架。

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

对于刚开始的任何人,如果您可以选择,我建议跳过 Windows 窗体并针对 WPF 进行开发。这是一个更好的创建 UI 的框架。有许多 MVC 框架正在为 WPF 开发,包括这个那个

于 2008-09-23T17:32:13.807 回答
4

据微软称,@jasonbunting 提到的 UIP 应用程序块已“存档”。相反,请查看Smart Client Application Block或更新的Smart Client Software Factory,它同时支持 WinForms 和 WPF SmartParts。

于 2008-09-23T23:06:03.880 回答
2

检查用户界面进程 (UIP) 应用程序块。我对它了解不多,但几年前看过它。可能有更新的版本,请检查。

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

于 2008-09-23T17:30:42.703 回答
1

查看 MS Patterns and Practices Smart Client 应用程序块,其中包含一些指导和类,可引导您在 Windows 窗体中实现模型视图演示者模式 - 查看包含的参考应用程序。

对于 WPF,这将被prism项目取代

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

于 2008-09-23T19:39:05.143 回答