这是一个有效的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模式实现吗

这几乎是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中,视图仅由演示者直接更改。