在被动视图中实现事件的好方法是什么?
-
18-09-2019 - |
题
我正在学习被动视图模式,以使我的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 系列。我在学习的时候发现这个非常有用
文章关于 查看与演示者的沟通 对你有用;这里有一个关于使用事件与直接调用的很好的讨论。更好的是, 事件聚合器 文章提出了一种“发布/订阅”机制,可以用来代替事件,同时保持代码可测试。这是我个人比较喜欢的方法,并且取得了很好的成功。
其他提示
查看 这 如何实施被动视图的示例。它有一种很好的方法来连接/取消连接视图和控制器之间的事件,将大部分工作放在控制器中。
不隶属于 StackOverflow