Winforms 如何在Windows窗体应用程序中实现MVC?
我没有开发太多的桌面/Windows窗体应用程序,但我想到,在Windows窗体.NET开发中使用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窗体中实现过MVC吗?如果是这样的话,你对设计有什么建议吗?事实上,Windows窗体实现了MVC的“自由风格”版本,就像一些电影实现了一些经典书籍的蹩脚的“自由风格”解释(罗密欧与朱丽叶浮现在脑海中) 我不是说Windows窗体的实现不好,只是。。。不一样 如果您使用Windows窗体和适当的OOP技术,或者使用类似ORM的EntitySpace来访问数据库,那么您可以这样说:
“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在回答中强调了什么。仅供参考,尚未更新