在被动视图中实现事件的好方法是什么?

dev*_*ost 6 c# passive-view winforms

我正在学习Passive View模式,以便让我的C#WinForms应用程序更容易测试和维护.

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

我的观点如下:

public interface IApplicationView
{
    event EventHandler Find;
}
Run Code Online (Sandbox Code Playgroud)

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

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()
    {
        // ...
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Rhy*_*nes 4

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

关于视图与演示者通信的文章将对您有用;这里有一个关于使用事件与直接调用的很好的讨论。更好的是,事件聚合器文章提供了一种“发布/订阅”机制,可以用来代替事件,同时保持代码可测试。这是我个人比较喜欢的方法,并且取得了很好的成功。