我没有开发太多桌面/Windows Forms 应用程序,但我想到使用 MVC(模型视图控制器)模式进行 Windows Forms .NET 开发可能会有一些好处。
有没有人在 Windows 窗体中实现 MVC?如果是这样,您对设计有什么建议吗?
我没有开发太多桌面/Windows Forms 应用程序,但我想到使用 MVC(模型视图控制器)模式进行 Windows Forms .NET 开发可能会有一些好处。
有没有人在 Windows 窗体中实现 MVC?如果是这样,您对设计有什么建议吗?
我过去所做的是使用类似的东西Model-View-Presenter。
[注意:这篇文章曾经可以在网络上找到。要立即查看,您需要下载 CHM,然后查看文件属性并单击取消阻止。然后您可以打开 CHM 并找到该文章。感谢一百万,微软! 叹息]
表单就是视图,我有一个 IView 接口。所有的处理都发生在 Presenter 中,它只是一个类。表单创建一个新的演示者,并将自己作为演示者的 IView 传递。通过这种方式进行测试,您可以改为传入一个假的 IView,然后从演示者向它发送命令并检测结果。
如果我要使用成熟的模型-视图-控制器,我想我会这样做:
这符合经典的 MVC 图。最大的缺点是,对于事件,很难分辨谁在订阅什么。MVP 模式使用方法而不是事件(至少我实现它的方式)。当表单/视图引发事件(例如 someButton.Click)时,表单只需调用演示者上的方法来运行它的逻辑。视图和模型根本没有任何直接联系;他们都必须通过主持人。
好吧,实际上 Windows 窗体实现了 MVC 的“自由风格”版本,就像一些电影实现了一些经典书籍的一些蹩脚的“自由风格”解释(我想到了罗密欧与朱丽叶)。
我并不是说 Windows 窗体的实现很糟糕,它只是......不同。
如果您使用 Windows 窗体和适当的 OOP 技术,并且可能使用像 EntitySpaces 这样的 ORM 来访问数据库,那么您可以这样说:
尽管 View 和 Controller 都由同一个对象表示,使得从表示中分离代码变得更加困难(没有简单的方法可以在派生自 Microsoft.Windows.Forms.Form 的类中插入“GTK+ 视图”)。
如果你足够小心,你能做什么。通过仅在事件处理程序中编写与 GUI 相关的内容以及在单独的类中编写所有其他业务逻辑,使您的表单代码与控制器/模型代码完全分离。在这种情况下,如果您想使用 GTK+ 编写另一个视图层,您只需要重写 GUI 代码。
据微软称,@jasonbunting 提到的 UIP 应用程序块已“存档”。相反,请查看Smart Client Application Block或更新的Smart Client Software Factory,它同时支持 WinForms 和 WPF SmartParts。
检查用户界面进程 (UIP) 应用程序块。我对它了解不多,但几年前看过它。可能有更新的版本,请检查。
“UIP 应用程序块基于模型-视图-控制器 (MVC) 模式。”
查看 MS Patterns and Practices Smart Client 应用程序块,其中包含一些指导和类,可引导您在 Windows 窗体中实现模型视图演示者模式 - 查看包含的参考应用程序。
对于 WPF,这将被prism项目取代
软件工厂方法是学习最佳实践的好方法