在哪里可以找到关于如何在Windows窗体中完全实现MVC模式的好例子?
我在各个站点上找到了许多教程和代码示例(例如,代码项目和.NetHeaven),但是许多比MVC更能代表观察者模式.由于我想开发的应用程序是针对学校项目的,我不愿意使用像PureMVC或MVC#这样的框架.
我认为应用程序彼此之间存在很大差异,我们对应用程序应该如何编写的理解仍然非常有限.我之前使用过的Windows Forms应用程序彼此之间存在很大差异.我见过的一些设计差异(包括大多数组合):
直接与数据库交谈(2层)
使用为给定应用程序编写的后端(3层)
使用一组为许多应用程序使用而编写的Web服务,并且无法针对您的应用程序进行更改.(面向服务的架构)
更新由CRUD操作完成
使用命令模式进行更新(向后端服务器发送命令)
大量使用数据绑定 /不使用数据绑定
大多数数据都是"表格式"(例如发票),在标准网格控件中运行良好/需要大多数UI数据的自定义控件.
一个开发人员/团队由10或20名开发人员组成(仅在UI上)
大量的单元测试使用模拟等/没有单元测试
因此,我认为创建一个总是很合适的MVC(或MVP)实现是不可能的.
我见过的最好的帖子真正解释了 MVC以及为什么 MVC系统按照它的方式构建,是Jeremy D Miller的"Build Your Own CAB"系列.通过它工作后,你应该能够更好地理解你的选择. 还应考虑Microsoft的智能客户端指南(CAB/Microsoft Composite Application Block).它有点复杂,但它适用于具有良好适合性的应用程序.
为Winforms项目选择MVC/MVP实现提供值得阅读的概述.很多人喜欢PureMVC.我从来没有使用它,但下次我需要一个MVC框架时我会看一下.
" Presenter First "是一种软件开发方法,它结合了Model View Presenter(MVP)设计模式和测试驱动开发的思想.它允许您从客户的语言编写测试开始.例如:
"当我点击'保存'按钮时,应该保存文件,未保存的文件警告应该消失."
我没有使用"Presenter First"的经验,但是当我有机会时我会试一试,因为它看起来很有前途.
您可能希望查看的其他Stack Overflow问题可以在这里和这里找到.
如果您正考虑在任何时候使用WPF,请查看Model-View ViewModel(MVVM)模式.这是一个非常好的视频你应该看看:Jason Dolinger在Model-View-ViewModel上.
MVVM(模型视图视图模型)Winforms的设计模式提供了另一个选项,可以在需要时更容易转换为WPF. Magical.Trevor是Windows Forms的另一个MVVM示例,它还包括基于属性名称的自动绑定.
还要问问自己为什么要使用MVC.
您希望能够对尽可能多的代码进行单元测试吗?
您是否尝试允许尽可能多的代码重用?
您是否想让您的代码库易于理解?
对于给定项目可能有效的其他101个原因.
一旦明确了目标,就可以更容易地选择一种或另一种.
更新:除了我之前的回答,我建议阅读"Presenter First"方法(特别是PDF文章)
我会推荐MVP(实际上是PassiveView模式)而不是MVC.您实际上并不需要任何特殊的框架,而是您组织代码的方式.
一种方法(我通常采用)是将每个窗体分成三个实体:
演示者/控制器类 - 这是您在开发表单时实际开始的内容.这是您的大多数/所有"业务"逻辑应该驻留的地方.
视图界面(IView),包含方法,属性和事件.此界面是演示者了解您的表单的所有内容.
最后,当您完成演示者和视图(包括单元测试)的实现时,您可以创建实际的表单类并使其实现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了吗?我发现,一旦他们开始构建特定的实现,没有人能够同意MVC的真实情况.
更新:您可以从更简单的东西(如MobileMVC)开始构建自己的.Compact Framework代码应该在Windows上编译/运行OK.由于这是一项学校作业,我建议你花一些时间学习MVC实际上是如何运作的.