MVP模式,一个Presenter对应多少个View?

9
我们正在尝试在(实际上)我们承担的所有新开发工作中使用Model-View-Presenter模式。
我坚信需要一个框架来帮助人们满足设计要求,我们有一些内部框架用于各种不同组件(日志记录、电子邮件发送等),因此我正在尝试开发一种MVP框架。
我已经成功地创建了一个易于使用的东西,适用于那些不熟悉MVP并且与我们当前工作方式不太相似的人们。问题在于它正在执行1个视图对应1个Presenter的关系。
以下是该框架的大致概述:
public abstract class Presenter<TView> where TView : IView {
  public virtual T View { get; set; }

  public virtual void Setup(TView view) {
    this.View = view; 
  }
}

public interface IView { }

基本的工作方式是,创建的任何 View 都继承自 IView 接口,并传递给继承自抽象类 PresenterPresenter 类。
正如您所看到的,我使用了 .NET 泛型,以便开发人员在处理 presenter(最终是从 presenter 继承的类)时具有 View 的强类型。
因此,我可以像这样设置基本的登录组件:
public class Login : Presenter<ILogin> {
  public override Setup(ILogin view){
    base.Setup(view);
    this.View.Login += new EventHandler(login);
  }
  void login(object sender, EventArgs e) { ... }
}

public interface ILogin : IView {
  string Username { get; set; }
  string Password { get; set; }
  event EventHandler Login;
}

正如我所说,我相当喜欢这个框架,它有编译器强制类型、强类型视图和MVP-类似模式。

但有些人对实现并不太满意,因为它在Presenter和View之间有一对一的关系,严格来说这不是MVP的本意。

我质疑这个论点是否真的有效,在我试用过这个框架的几个项目中(从中等到大型项目),我没有找到任何好的例子让我觉得“我需要为这个Presenter添加多个视图”。当我看到可以在多个视图之间共享的功能时,我会质疑它是否应该与特定的Presenter绑定,或者是否应该放在一个更中立的类中。

我想知道,我试图实现的框架是否离MVP太远而无法称之为MVP?将多个视图与一个Presenter相关联的需求是否是MVP的主要目标?是否可能有一个真正的.NET MVP框架支持n个视图?

2个回答

8
我认为你的方法是没有问题的。在一个Presenter和View之间,并不需要严格遵守一对多的关系 - 通常每个Presenter只有一个View。MVP的思想是解耦Presenter和View,以便在需要时更容易地切换View(例如支持Web应用程序和桌面应用程序),但这并不意味着您必须使其动态化。
一个建议:我通常将IView作为构造函数参数提供给Presenter。然后,具体实现IView的类创建Presenter(通过硬编码的new Presenter(this)或使用IoC容器获取)。

我能看出将视图作为构造函数参数传递的优点,但大多数情况下是用于 Web 应用程序,并且我有另一个类,该类随后使用 Presenter 包装 UserControl(以便您可以在 UI 级别继承)。 - Aaron Powell
你能否回答一下这个问题:http://stackoverflow.com/questions/8851933/event-bubbling-and-mvp-asp-net? - LCJ

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接