这是一个有效的MVP模式实现吗
本文关键字:MVP 模式 实现 有效 一个 | 更新日期: 2023-09-27 18:21:27
我正在尝试分析一些使用MVP方法设计的代码。没有使用任何特定的MVP框架。这都是手写的代码。
//Interface Representing our View
public interface IFooView
{
string SomeScreenValue
}
//Presenter Implementation
public class FooPresenter
{
private readonly IFooView _view;
public FooPresenter (IFooView view)
{
//The presenter gets instantiated with a reference to a view.
_view = view
}
public void SomeButton_Click(object sender, EventArgs e)
{
_view.SomeScreenValue = "The Result";
}
}
//The Page Implementation
public class FooPage : System.Web.UI.Page, IFooView
{
private FooPresenter _presenter;
protected void Page_Init(...)
{
_presenter = new FooPresenter(this);
//<-- The View has a Presenter, which references the same View...
Button1.Click += new EventHandler(_presener.SomeButton_Click);
}
}
它的工作原理是允许开发人员将业务逻辑从代码转移到类中,同时仍然影响视图。但是,缺少实际的模型,以及视图=>演示者=>视图关系的设置方式对我来说有点烦人?
那么,上述情况是MVP模式的有效实施吗?
这几乎是MVP,因为演示者与视图的耦合方式是,当它更新UI状态时,它会通过IFooView
接口进行更新。但是,在演示者中使用符合标准.NET事件处理程序的方法对我来说似乎是错误的。我会让IFooView
在按钮单击时引发事件,然后您的页面可以像当前一样执行处理按钮单击的任务,然后引发演示者处理的事件。此事件可能与域关系更密切,例如,您可能希望通过IFooView
公开RecordUpdated
之类的事件。
这将使为单元测试提供IFooView
的模拟实现变得更容易,毕竟这是使用MVP/MVC/MVM模式的一大优势。
如果没有来自后端服务或数据库的任何数据,那么在简单应用程序的情况下,演示者也可以扮演模型的角色。这就是您的琐碎示例中的情况。MVVM中也可以这样做,其中ViewModel也可以承担Model的职责。但是,如果您做了任何不平凡的事情,我建议您创建一个模型。在您的情况下,演示者将委托给模型来维护状态,并将使用某种"服务"来保持对此模型的更改,或从web服务中检索模型对象。
是的。
但是。。。我应该将presenter构造改为FooPage构造。有时您想要处理preInit事件,而此设置不可能做到这一点。
Fowler在2004年描述了MVP模式,并于2006年将其分解为监督控制(sc)和被动视图(pv),从而将其退役。在sc中,视图绑定到模型,而在pv中,视图仅由演示者直接更改。