我正在学习被动视图模式,以使我的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;
    }
}

谢谢!

有帮助吗?

解决方案

使用 WinForms 学习 MVP 的另一个重要资源是 Jeremy Millers 建立您自己的 CAB 系列。我在学习的时候发现这个非常有用

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

其他提示

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top