我在这里尝试分析一些使用 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 与 View 分离,当它更新 UI 状态时,它通过 IFooView
接口(interface)进行更新.但是,在您的演示者中使用符合标准 .NET 事件处理程序的方法对我来说似乎是错误的。我会让 IFooView
在按钮单击发生时引发事件,然后您的页面可以像您当前一样执行处理按钮单击的任务,然后引发您的 Presenter 处理的事件。此事件可以与域更密切相关,例如,您可能希望通过 IFooView
公开诸如 RecordUpdated
之类的事件。
这将使为单元测试提供 IFooView
的模拟实现变得更加容易,这毕竟是使用 MVP/MVC/MVVM 模式的一大优势。
如果您没有来自后端服务或数据库的任何数据,那么对于简单的应用程序,Presenter 也可以承担模型的角色。在您的简单示例中就是这种情况。同样可以在 MVVM 中完成,其中 ViewModel 也可以承担模型的职责。但是,如果您做任何重要的事情,我建议您创建一个模型。在您的情况下,Presenter 将委托(delegate)模型维护状态,并使用某种“服务”来保存对此模型的更改,或从 Web 服务检索模型对象。
关于c# - 这是一个有效的 MVP 模式实现吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8985380/