我在几个使用被动视图的WinForms应用程序中实现了MVP模式。我通过实现一个包含属性和委托(以Action< T >和Func< T >形式)的接口来连接具体视图中的UI事件并回调到Presenter。
我即将开始一个新项目,并在网上进行了一些关于该模式的研究,包括这里的许多模式示例,并注意到它们都使用EventHandler来通知Presenter。
我不太理解为什么会在这种情况下使用事件,因为我认为视图只有一个Presenter。
我的问题是,这是为了保持与.NET框架使用事件的一致性,还是出于其他我没有看到的原因?
以下是我使用的模式的一个微不足道的示例:
我即将开始一个新项目,并在网上进行了一些关于该模式的研究,包括这里的许多模式示例,并注意到它们都使用EventHandler来通知Presenter。
我不太理解为什么会在这种情况下使用事件,因为我认为视图只有一个Presenter。
我的问题是,这是为了保持与.NET框架使用事件的一致性,还是出于其他我没有看到的原因?
以下是我使用的模式的一个微不足道的示例:
public interface IViewAbstraction
{
public ModelData ModelData { set; }
public Action<ModelData> ModelDataChangedCallback { set; }
}
public class SomeWinForm : Form, IViewAbstraction
{
private Action<ModelData> modelDataChanged;
private ModelData model;
public ModelData ModelData
{
set { /* when this property changes, update UI */ }
}
public Action<ModelData> ModelDataChangedCallback
{
set { modelDataChanged = value; }
}
private void OnSomeWinformsEvent(EventArgs args)
{
if (modelDataChanged == null) throw new Exception();
modelDataChanged(model);
}
}
public class Presenter
{
private readonly IViewAbstraction view;
private readonly IDataLayerAbstraction dataLayer;
public Presenter(IViewAbstraction view, IDataLayerAbstraction dataLayer)
{
this.dataLayer = dataLayer;
this.view = view;
this.view.ModelDataChangedCallback = OnModelChanged;
this.view.ModelData = dataLayer.GetData();
}
private void OnModelChanged(ModelData data)
{
// validate and save data.
}
}
ModelDataChangedEventArgs
类来包含Presenter需要处理的数据,对吗?当有很多事件时,模板代码类的数量将会爆炸。所有的Action<T> MyDelegate
都必须更改为EventHandler<MyCallbackEventArgs> MyEvent
...由于这是一种1:1的映射,清除调用列表的可能性应该非常有限... - Joan Charmant