用Windows Forms实现MVC

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

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


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

  • 直接与数据库交谈(2层)
  • 使用为给定应用程序编写的后端(3层)
  • 使用一组Web服务,这些服务是为许多应用程序使用而编写的,无法针对您的应用程序进行更改。 (面向服务的体系结构)
  • CRUD操作正在进行更新
  • 正在使用命令模式进行更新(向后端服务器发送命令)
  • 很多数据绑定的用法/没有数据绑定的用法
  • 大多数数据类似于“表格”(例如发票),这些数据在标准网格控件中运行良好/需要大多数UI数据的自定义控件。
  • 一个开发人员/ 10或20个开发人员的团队(仅在用户界面上)
  • 很多单元测试使用mocks等/没有单元测试
  • 因此,我认为不可能创建一个总是适合的MVC(或MVP)的实现。

    我见过的最棒的帖子真正解释了 MVC,以及为什么 MVC系统的构建方式是Jeremy D Miller的“Build Your Own CAB”系列。 工作之后,你应该能够更好地理解你的选择。 也应该考虑微软的智能客户指导(CAB /微软复合应用程序块)。 这有点复杂,但它适用于适合的应用程序。

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

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

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

    我没有使用“Presenter First”的经验,但是当我有机会的时候我会尝试一下,因为它看起来非常有前途。

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

    如果您想在任何时候使用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的实际工作方式。

    链接地址: http://www.djcxy.com/p/30203.html

    上一篇: Implementing MVC with Windows Forms

    下一篇: Which design patterns are used on Android?