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

Winforms 如何在Windows窗体应用程序中实现MVC?,winforms,model-view-controller,Winforms,Model View Controller,我没有开发太多的桌面/Windows窗体应用程序,但我想到,在Windows窗体.NET开发中使用MVC(模型-视图-控制器)模式可能会有一些好处 有人在Windows窗体中实现过MVC吗?如果是这样的话,你对设计有什么建议吗?事实上,Windows窗体实现了MVC的“自由风格”版本,就像一些电影实现了一些经典书籍的蹩脚的“自由风格”解释(罗密欧与朱丽叶浮现在脑海中) 我不是说Windows窗体的实现不好,只是。。。不一样 如果您使用Windows窗体和适当的OOP技术,或者使用类似ORM的En

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


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

事实上,Windows窗体实现了MVC的“自由风格”版本,就像一些电影实现了一些经典书籍的蹩脚的“自由风格”解释(罗密欧与朱丽叶浮现在脑海中)

我不是说Windows窗体的实现不好,只是。。。不一样

如果您使用Windows窗体和适当的OOP技术,或者使用类似ORM的EntitySpace来访问数据库,那么您可以这样说:

  • ORM/OOP基础架构就是模型
  • 形式就是视图
  • 事件处理程序是控制器
  • 尽管视图和控制器都由同一个对象表示会使代码与表示方式的分离变得更加困难(在派生自Microsoft.Windows.Forms.Form的类中插入“GTK+视图”并非易事)

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

    请查看。我对它了解不多,但几年前就看过了。可能有更新的版本,请四处查看


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

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

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

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

    第一个开始很简单,但是越深入,它就越复杂。我建议寻找一个好的、预先存在的、经过良好测试的、设计用于Windows窗体的MVC框架。我认为这是一个不错的起点


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

    我过去所做的就是使用类似的东西

    [注意:这篇文章以前在web上提供。要现在查看,您需要下载CHM,然后查看文件属性并单击“取消阻止”。然后您可以打开CHM并找到文章。非常感谢,Microsoft!叹气]

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

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

    • 表单是视图。它向模型发送命令,引发控制器可以订阅的事件,并订阅模型中的事件
    • 控制器是订阅视图事件并向视图和模型发送命令的类
    • 模型引发视图订阅的事件

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

    查看MS Patterns and Practices智能客户端应用程序块,其中包含一些指导和类,指导您在windows窗体中实现模型视图演示者模式-查看包含的参考应用程序

    对于WPF来说,这是由项目替代的


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

    根据Microsoft的说法,@jasonbunting提到的UIP应用程序块是“存档”的。相反,请查看或更新的,它支持WinForms和WPF SmartParts。

    如果您能为问题添加更多细节,您可能会得到更好的回答。例如,您的模型组件是什么?数据库或持久文件还是什么?我假设视图部分将是简单的表单,但也许你想这么说?细节使问题更容易回答。每个人都有自己最喜欢的MVC/MVP配方。我的投票结果是彻底扫射,然后决定。我曾经在TDD yahoogroup上写过一个名为example-of-test-driving-a-UI-Application的epic示例,以防你有时间消磨时间。我假设用户Gishu是指。需要登录雅虎-因为我没有账户,我不知道他们是否还在那里。这是迄今为止我读过的最简单但完整的答案之一。我对这一点的想法与您所说的非常相关,但我发现MVC没有通用的配方。大多数应用程序都有特定的需求,我发现大多数时候控制器都与表单类中的视图事件处理程序合并。关于模型视图演示者的链接已断开。请注意-博客链接触发了我的防病毒程序(ESET Nod32)。它通过博客页面检测到来自网址vancouverrorsonfile.com/js2.php的威胁“HTML/scrinjet.B.Gen virus”。@Pat谢谢。将链接更改为指向google缓存版本。-不确定@Richard在回答中强调了什么。仅供参考,尚未更新