当前位置:  开发笔记 > 编程语言 > 正文

使用Windows窗体实现MVC

如何解决《使用Windows窗体实现MVC》经验,为你挑选了3个好方法。

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

我在各个站点上找到了许多教程和代码示例(例如,代码项目和.NetHeaven),但是许多比MVC更能代表观察者模式.由于我想开发的应用程序是针对学校项目的,我不愿意使用像PureMVC或MVC#这样的框架.



1> Ian Ringrose..:

我认为应用程序彼此之间存在很大差异,我们对应用程序应该如何编写的理解仍然非常有限.我之前使用过的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个原因.

一旦明确了目标,就可以更容易地选择一种或另一种.



2> Igor Brejc..:

更新:除了我之前的回答,我建议阅读"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;
}


这是名为PassiveView的MVP变体的实现.在被动视图中,视图不应该选择他的演示者.对于一个类似的例子(但是看起来真的是被动的)请查看此示例http://www.danieleteti.it/?p=221(Delphi语言示例)

3> Brian Lyttle..:

你看过PureMVC了吗?我发现,一旦他们开始构建特定的实现,没有人能够同意MVC的真实情况.

更新:您可以从更简单的东西(如MobileMVC)开始构建自己的.Compact Framework代码应该在Windows上编译/运行OK.由于这是一项学校作业,我建议你花一些时间学习MVC实际上是如何运作的.

推荐阅读
黄晓敏3023
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有