我们正在尝试在(实际上)我们承担的所有新开发工作中使用Model-View-Presenter模式。
我坚信需要一个框架来帮助人们满足设计要求,我们有一些内部框架用于各种不同组件(日志记录、电子邮件发送等),因此我正在尝试开发一种MVP框架。
我已经成功地创建了一个易于使用的东西,适用于那些不熟悉MVP并且与我们当前工作方式不太相似的人们。问题在于它正在执行1个视图对应1个Presenter的关系。
以下是该框架的大致概述:
基本的工作方式是,创建的任何 View 都继承自
正如您所看到的,我使用了 .NET 泛型,以便开发人员在处理 presenter(最终是从 presenter 继承的类)时具有 View 的强类型。
因此,我可以像这样设置基本的登录组件:
我坚信需要一个框架来帮助人们满足设计要求,我们有一些内部框架用于各种不同组件(日志记录、电子邮件发送等),因此我正在尝试开发一种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
接口,并传递给继承自抽象类 Presenter
的 Presenter 类。正如您所看到的,我使用了 .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个视图?