6

我正在学习被动视图模式,以使我的 C# WinForms 应用程序更易于测试和维护。

到目前为止它运行良好,但我想知道是否有比我现在做的更好的方法来实现事件(并保持它们可测试)。这就是它的样子(省略与本示例无关的代码)。基本上我正在寻找是否有一种方法可以跳过演示者和表单中的事件,我宁愿在演示者中完成所有工作。

我的观点是这样的:

public interface IApplicationView
{
    event EventHandler Find;
}

我的主持人看起来像这样:

public class ApplicationPresenter
{
    private IApplicationView _view;
    private IApplicationDomain _domain;

    public ApplicationPresenter(IApplicationView view) : this(view, new ApplicationDomain()) {}
    public ApplicationPresenter(IApplicationView view, IApplicationDomain domain) {
        _view = view;
        _domain = domain;

        HookupEventHandlersTo(view);
    }

    private void HookupEventHandlersTo(IApplicationView view)
    {
        view.Find += delegate { FindAction(); };
    }

    public void FindAction()
    {
        // ...
    }
}

我的 WinForm 看起来像:

public partial class Form1 : Form, IApplicationView
{
    private ApplicationPresenter _presenter;
    public event EventHandler Find = delegate {};

    public Form1()
    {
        InitializeComponent();
        _presenter = new ApplicationPresenter(this);
        HookupEvents();
    }

    private void HookupEvents()
    {
        searchButton.Click += Find;
    }
}

谢谢!

4

2 回答 2

3

另一个使用 WinForms 学习 MVP 的好资源是 Jeremy Millers Build Your Own CAB系列。我在学习时发现这非常有用,

关于View to Presenter Communication的文章将对您有用;这里有一个关于使用事件与直接调用的很好的讨论。更好的是,Event Aggregator文章提出了一种“发布/订阅”机制,可以代替事件使用,同时保持代码可测试。这是我个人更喜欢的方法,并且取得了很好的成功。

于 2009-11-06T08:44:21.343 回答
0

查看这个如何实现被动视图的示例。它有一种很好的方式来连接/取消连接视图和控制器之间的事件,将大部分工作放在控制器中。

于 2009-11-05T18:48:52.273 回答