用Windows Forms实现MVC

我在哪里可以find如何在Windows窗体中完全实现MVC模式的一个很好的例子?

我在各种站点上find了许多教程和代码示例(例如, Code Project和.NetHeaven),但许多代表观察者模式比MVC更具代表性。 由于我想开发的应用程序是用于学校项目,所以我不愿意使用PureMVC或MVC#这样的框架。

我认为应用程序如此不同,我们对如何编写应用程序的理解仍然非常有限。 我曾经工作过的Windows窗体应用程序是如此不同。 我所看到的一些devise差异(包括大多数组合):

  • 直接与数据库交谈(2层)
  • 使用为给定应用程序编写的后端(3层)
  • 使用许多应用程序编写的一组Web服务,不能为您的应用程序进行更改。 (面向服务的体系结构)
  • CRUD操作正在进行更新
  • 正在使用命令模式进行更新(向后端服务器发送命令)
  • 很多数据绑定的用法/没有数据绑定的用法
  • 大多数数据是“表格式的”(如发票),在标准网格控件中运行良好/需要大部分UI数据的自定义控件。
  • 一个开发人员/ 10或20个开发人员的团队(仅在用户界面上)
  • 许多unit testing使用嘲笑等/没有unit testing

所以我不认为有可能创build一个总是适合的MVC(或MVP)的实现。

我见过的最好的post是真正解释 MVC, 为什么 MVC系统是按照它的方式构build的,是Jeremy D Miller的“Build your own CAB”系列 。 工作之后,你应该能够更好地理解你的select。 还应该考虑微软的智能客户端指导(CAB /微软复合应用程序块) 。 这有点复杂,但对于适合的应用程序可以很好地工作。

为Winforms项目select一个MVC / MVP实现给出一个值得阅读的概述。 很多人喜欢PureMVC 。 我从来没有使用它,但我会在下一次需要MVC框架时看看它。

“ Presenter First ”是一种软件开发方法,它结合了模型视图演示者(MVP)devise模式和testing驱动开发的思想 。 它可以让你开始用客户的语言编写testing。 例如:

“当我点击”保存“button时,文件应该保存,未保存的文件警告应该消失。

我没有使用“Presenter First”的经验,但是当我有机会的时候,我会试试看,因为它看起来很有希望。

其他堆栈溢出问题,你可能会希望看看在这里和这里 。

如果您正在考虑在任何时候使用WPF ,请查看Model-View ViewModel(MVVM)模式。 这里是一个非常好的video,你应该看看: 模型 – 视图 – 视图模型Jason Dolinger 。

用于Winforms的MVVM(模型视图视图模型)devise模式提供了另一个选项,如果需要的话,它可以使其转换为WPF。 Magical.Trevor是Windows Forms的另一个MVVM示例,它还包含基于属性名称的自动绑定。


也问问你自己为什么使用MVC。

  • 你是否希望能够尽可能多地testing代码?
  • 你是否试图让尽可能多的代码被重用?
  • 你是否试图让你的代码库容易理解?
  • 101个其他的原因,可以有效的一个给定的项目。

一旦你清楚你的目标 ,select一个或另一个实施变得更容易。

更新:除了我以前的答案,我build议阅读“Presenter First”方法 (特别是PDF文章)

我会推荐MVP(实际上是PassiveView模式),而不是MVC。 你真的不需要任何特殊的框架,只是你如何组织你的代码。

一种方法(我通常采用)是将每个窗体分成三个实体:

  1. 演示者/控制器类 – 这是您在开发表单时实际开始的内容。 这是大部分/所有“业务”逻辑应该驻留的地方。
  2. 一个视图界面(IView),其中包含方法,属性和事件。 这个接口是主持人知道你的表单的全部内容。
  3. 最后,在完成演示者和视图(包括unit testing)的实现时,可以创build实际的窗体类并使其实现IView接口。 那么这只是一个添加适当的控件到表单并将它们连接到接口的问题。

示例代码(一个简单的伪代码,仅用于说明):

interface IView { string Username { get; set; } string Password { get; set; } event EventHandler LogOnButtonClicked; void InformUserLogOnFailed(); void MoveToMainScreen(); } class Presenter { public Presenter(IView view) { this.view = view; view.LogOnButtonClicked += new EventHandler(OnLogOnButton); } private void OnLogOnButton() { // we ask some service to verify the username/password bool isLogOnOk = logOnService.IsUserAndPasswordOk(view.Username, view.Password); if (isLogOnOk) view.MoveToMainScreen(); else { view.Username = ""; view.Password = ""; view.InformUserLogOnFailed(); } } private IView view; } class Form : IView { public Form() { presenter = new Presenter(this); } public string Username { get { return TextBoxUsername.Text; } set { TextBoxUsername.Text = value; } } public string Password { get { return TextBoxPassword.Text; } set { TextBoxPassword.Text = value; } } public void InformUserLogOnFailed() { MessageBox.Show("Invalid username or password."); } public void MoveToMainScreen() { // code for opening another form... } private Presenter presenter; } 

你看过PureMVC吗? 我发现,一旦开始构build特定的实现,没有人能够就MVC真正的样子达成一致。

更新:你可以build立自己的起点,如MobileMVC更简单。 Compact Framework代码应该在Windows上编译/运行OK。 由于这是一个学校任务,我build议你实际上花一些时间来学习MVC是如何工作的。

您可能想看看差异执行 。

这里是在SourceForge中

国际海事组织,这是一个MVC巨大的改善,但它仍然是非常不寻常的。

在这里可以find一个使用Windows Forms自己实现MVC的好例子。 包括源代码。

当你阅读,学习和编写这个任务的代码时,你会发现在如何实现MVC方面存在很多分歧。 这是一个简单的例子,反映了关注点的分离,也是一个很好的例子。

当你失学的时候,你可能会想像其他海报推荐的那样回到一个框架上。

微软复合接口应用程序块作为一个MVC实现开始了其生命(其中包括实现的其他模式)。 然而,发布版本演变成MVP实现,这可能被认为是对MVC概念的一种不同的解释。

如果你愿意检查一个非常完整的MVP实现的代码,你可以findMS-CAB作为Microsoft Smart Client Software Factory的组件之一。 它带有源代码。 你可以在这里find它。 祝你好运!