9

我们正在尝试将模型-视图-演示者模式用于(实际上)我们承担的所有新开发工作。

我坚信有一个框架可以帮助人们满足设计要求,我们有一些用于各种不同组件(日志记录、电子邮件发送等)的内部框架,所以我正在尝试获得某种 MVP开发的框架。

我已经设法为那些不熟悉 MVP 并且与我们目前的工作方式相差不远的人提供了一些易于使用的东西。问题是它与 1 个视图与 1 个演示者建立了关系。

这是框架的粗略轮廓:

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 { }

它的基本工作方式是创建的任何视图都从IView接口继承,并传递给从抽象类继承的Presenter类。Presenter

正如您所看到的,我正在使用 .NET 泛型,以便开发人员在使用演示者(然后最终是从演示者继承的类)时可以对视图进行强类型化。

所以我可以像这样设置一个基本的登录组件:

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模式。

虽然有些人对实现不太满意,因为它在演示者和视图之间具有 1 对 1 的关系,严格来说这不是 MVP 的本意。

我质疑这个论点的有效性,在我一直在跟踪这个框架的几个项目中(从中型到大型项目)我没有找到任何我认为“我需要为这个演示者提供多个视图”的好例子. 当我看到可以在多个视图之间共享的功能时,我质疑它是否应该与特定的演示者绑定,或者它是否应该在一个更中立的类中。

我试图实现的框架是否离 MVP 太远而不能被称为 MVP?MVP 的主要目标是需要对演示者有多个视图吗?是否有可能拥有一个真正支持 n-view 的 .NET MVP 框架?

4

2 回答 2

8

我认为您的方法没有问题。您不需要在演示者和视图之间建立一对多的关系 - 通常每个演示者只有一个视图。MVP 背后的想法是将演示者与视图分离,以便您可以在需要时更轻松地切换视图(例如,同时支持 Web 应用程序和桌面应用程序),但这并不意味着您必须使其动态化。

一个建议:我通常将.IView作为构造函数参数提供给Presenter. then的具体实现IView创建了演示者(通过硬编码new Presenter (this)或使用 IoC 容器来获取它。

于 2009-05-13T05:13:37.170 回答
0

您可能会发现使用 Windows 窗体实现 MVC的答案很有帮助,因为他们讨论了实现 MVC 和 MVP 时的不同选项

于 2009-08-21T08:49:31.253 回答