[英]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事件,而这种设置是不可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.