在被动视图中实现事件的好方法是什么?
我正在学习被动视图模式以保留我的 C# WinForms 应用程序 更容易测试和维护。
到目前为止效果很好,但我想知道是否有更好的方法来实现 事件比我现在做的方式(并保持它们可测试)。这是 它是什么样子的(省略与此示例无关的代码)。基本上是什么 我正在寻找是否有一种方法可以跳过连接事件 Presenter 和表单中,我更喜欢在 Presenter 中完成所有工作。
我的视图如下所示:
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;
}
}
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
使用 WinForms 学习 MVP 的另一个重要资源是 Jeremy Millers 构建您自己的 CAB 系列。我在学习时发现这非常有用,
查看到演示者通信将对您有用;这里有一个关于使用事件与直接调用的很好的讨论。更好的是, 事件聚合器一文提出了一种“发布/订阅”机制,可以用来代替事件,同时保持代码可测试。这是我个人比较喜欢的方法,并且取得了很好的成功。
Another great resource for learning MVP with WinForms is Jeremy Millers Build Your Own CAB series. I found this incredibly useful when I was learning,
The article on View to Presenter Communication will be useful to you; there is a good discussion here on using events vs making direct calls. Even better, the Event Aggregator article presents a "publish/subscribe" mechanism that can be used instead of events, while keeping the code testable. This is the approach that I personally prefer, and have had good success with.
查看 这个示例说明了如何实现被动视图。它有一种很好的方法来连接/取消连接视图和控制器之间的事件,将大部分工作放在控制器中。
Check out this example of how to implement the Passive View. It has a good way of wiring/unwiring for events between the view and controller that puts most of the work in the controller.