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

时间:2009-11-05 17:49:50

标签: c# winforms passive-view

我正在学习Passive View模式以保留我的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;
    }
}

谢谢!

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

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