我正在学习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;
}
}
谢谢!
答案 0 :(得分:3)
使用WinForms学习MVP的另一个重要资源是Jeremy Millers Build Your Own CAB系列。我在学习时发现这非常有用,
View to Presenter Communication上的文章对您有用;这里有一个关于使用事件与直接调用的良好讨论。更好的是,Event Aggregator文章提供了一种“发布/订阅”机制,可以用来代替事件,同时保持代码可测试。这是我个人喜欢的方法,并取得了很好的成功。
答案 1 :(得分:0)
查看this如何实施被动视图的示例。它有一种很好的方法可以在视图和控制器之间连接事件,从而将大部分工作放在控制器中。