.net 用Windows窗体实现MVC

.net 用Windows窗体实现MVC,.net,winforms,model-view-controller,.net,Winforms,Model View Controller,我在哪里可以找到一个关于如何在Windows窗体中完全实现MVC模式的好例子 我在各种网站上找到了许多教程和代码示例(例如,.netgovernment和.netgovernment),但其中许多教程和代码示例比MVC更能代表observer模式。由于我想开发的应用程序是用于学校项目的,所以我不愿意使用或之类的框架。您看过吗?我发现,一旦开始构建一个特定的实现,就没有人能够就MVC的真正外观达成一致 更新:你可以从一些简单的东西开始,比如。压缩框架代码应在Windows上编译/运行正常。由于这是

我在哪里可以找到一个关于如何在Windows窗体中完全实现MVC模式的好例子

我在各种网站上找到了许多教程和代码示例(例如,.netgovernment和.netgovernment),但其中许多教程和代码示例比MVC更能代表observer模式。由于我想开发的应用程序是用于学校项目的,所以我不愿意使用或之类的框架。

您看过吗?我发现,一旦开始构建一个特定的实现,就没有人能够就MVC的真正外观达成一致


更新:你可以从一些简单的东西开始,比如。压缩框架代码应在Windows上编译/运行正常。由于这是一项学校作业,我建议您实际花一些时间学习MVC的实际工作原理。

您可能想看看

在这里


在我看来,这是对MVC的巨大改进,尽管它仍然很不寻常。

可以找到一个使用Windows窗体滚动自己的MVC实现的好例子。包括源代码

在阅读、研究和编写本作业的代码时,您会发现在如何实现MVC方面存在很多分歧。这是一个简单的案例,反映了关注点的分离,也是连接这一点所需的“管道”的一个很好的例子


当你离开学校时,你可能会想回到其他海报所推荐的框架上。

我认为申请书之间差异很大,我们对如何编写申请书的理解仍然非常有限。我以前使用过的Windows窗体应用程序彼此非常不同。我看到的一些设计差异包括(包括大多数组合):

  • 直接与数据库对话(2层)
  • 使用已为给定应用程序编写的后端(3层)
  • 使用一组web服务,这些服务是为许多应用程序编写的,不能为您的应用程序更改。(面向服务的体系结构)
  • 操作正在进行更新
  • 正在使用完成更新(将命令发送到后端服务器)
  • 大量使用/未使用数据绑定
  • 大多数数据都是“类似表格”(例如发票),在标准网格控件中运行良好/需要对大多数UI数据使用自定义控件
  • 一个开发人员/由10或20名开发人员组成的团队(仅在UI上)
  • 使用模拟等进行大量单元测试/无单元测试
因此,我认为不可能创建一个始终适合的MVC(或MVP)实现

我所看到的解释MVC和为什么MVC系统是这样构建的最好的帖子是。工作后,虽然你应该能够更好地理解你的选择。 也应予以考虑。这有点复杂,但它可以很好地适用于适合的应用程序

选择一篇文章,给出一个值得一读的概述。很多人都喜欢。我从未使用过它,但下次需要MVC框架时,我会研究它

“”是一种软件开发方法,它结合了模型视图演示器(MVP)设计模式和。它允许您从用客户的语言编写测试开始。例如:

“当我单击“保存”按钮时 应保存该文件,并且 应显示未保存的文件警告 消失。”

我没有使用“Presenter First”的经验,但如果有机会,我会尝试一下,因为它看起来很有前途

您可能希望了解的其他问题包括和

如果您正在考虑在任何时候使用WPF,请查看该模式。下面是一个非常好的视频,您应该查看:

提供另一个选项,如果需要,可以更轻松地转换为WPF。这是另一个用于Windows窗体的MVVM示例,它还包括基于属性名的自动绑定


还要问自己为什么使用MVC

  • 您希望能够对尽可能多的代码进行单元测试吗
  • 您是否试图允许尽可能多的代码被重用
  • 您是否试图使代码库易于理解
  • 101对给定项目有效的其他原因

一旦你明确了你的目标,选择一个或另一个实现就变得更容易了。

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


如果您愿意检查一个非常完整(而且有些复杂)的MVP实现的代码,您可以找到MS-CAB作为Microsoft Smart Client软件工厂的组件之一。它附带源代码。您可以找到它。祝您好运!

更新:除了我前面的回答之外,我建议您阅读关于(尤其是PDF文章)

我会推荐MVP(实际上是被动查看模式)而不是MVC。你不需要任何特殊的框架,这只是你组织代码的方式

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

  • presenter/controller类—这是您在开发表单时实际开始的部分。这是大多数/所有“业务”逻辑应该驻留的地方
  • 一个视图界面(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;
    }