繁体   English   中英

这是有效的MVP模式实现吗

[英]Is this a valid MVP Pattern Implementation

我正在尝试分析一些使用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);
    }
}

它的工作原理是,允许开发人员将业务逻辑从代码移到类中,同时仍然影响View。 但是,缺少实际模型以及设置View => Presenter => View关系的方式对我来说有点讨厌吗?

那么以上情况是MVP模式的有效实现吗?

几乎是MVP,因为您的Presenter与视图分离的方式是,它在更新UI状态时会通过IFooView界面进行更新。 但是,在演示者中使用符合标准.NET事件处理程序的方法对我来说似乎是错误的。 我将使IFooView在发生按钮单击时引发一个事件,然后您的页面可以像当前一样执行处理按钮单击的任务,然后引发Presenter处理的事件。 这个事件可以更密切相关的领域,比如你可能要等事件RecordUpdated通过你暴露IFooView

这将使为单元测试提供IFooView的模拟实现更加容易, IFooView这是使用MVP / MVC / MVVM模式的一大优势。

如果您没有来自后端服务或数据库的任何数据,那么在简单应用程序的情况下,Presenter也可以担当模型的角色。 在您的琐碎示例中就是这种情况。 在MVVM中可以执行相同的操作,其中ViewModel也可以承担Model职责。 但是,如果您做任何不重要的事情,我建议您创建一个模型。 在您的情况下,演示者将委托模型维护状态,并使用某种“服务”将对模型的更改持久化,或从Web服务中检索模型对象。

是的。

但是...我应该将presenter结构更改为FooPage构造函数。 有时您想处理preInit事件,而这种设置是不可能的。

是的,这是模型视图演示者的“被动视图”变体。 在此变体中,视图完全不了解该视图。 该视图是愚蠢的,并且完全由演示者控制。

FVP在2004年描述了MVP模式,他在2006年将MVP模式分为监督者 (sc)和被动视图 (pv) 退休 在sc中,视图绑定到模型,而在pv中则不绑定,在pv中,视图仅由演示者直接更改。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM