MVP模式在asp.net中的应用

  前段时间,由于项目中需要用到MVP模式,于是我便来博客园查了一下,发现博客园有关MVP模式的资料少之又少,加上本人在博客园潜水这么久,也想出来透透气啦,从而产生了写博的冲动。整个项目做下来,也对MVP模式有了一定的了解,特写下这篇文章来做一个总结吧,希望对学习MVP模式的朋友有所帮助。话不多说,直接上图:

    

  但是本章的重点不是这张图,而是在asp.net项目中怎么去用MVP模式。如果您对MVP模式有所了解的话,那么接下来就要上菜啦。

  下面就用一个view开始:

    

public interface IMvpView
{
}

  这是一个最基本的View接口,也就是说我们的UI(page,control)会直接或间接的继承它,我们还可以在这个接口里定义一些属性和方法,而这些属性和方法是在我们每个界面都会用到的。很简单吧!

 

  接下来就是一个presenter的基础类:

  

public abstract class Presenter<TView> where TView : IMvpView
{
public TView View { get; set; }

public virtual void OnViewInitialized()
{
}

public virtual void Save()
{
}
}

 

 

  这是一个最基本的presenter class,我把它定义为一个抽象的泛型类。这个类的内容也很简单,它有一个TView类型的View属性,注意这里的TView不应该是一个具体View,而应该是一个View的抽象。它还包括两方法,OnViewInitialized()和Save(), 我都把它们定义为Virtual,是要在继承类中重载。其中OnViewInitialized()方法里主要执行一些当(IsPostBack==false)的操作,当然你还可以增加一个OnViewLoad()方法,来执行当页面加载时的操作.

  

  定义了一些最基本的,接下来我要定义一些东东继承它们。

  接下来创建一个IPersonView,它继承自我们最基本的view接口IMvpView:

  

public interace IPersonView:IMvpView
{
IList
<Person> Persons{get;set;}
void Save();
}

  接下来我又创建了一个PersonPresenter类,它继承自Presenter抽象类

  

public class PersonPresenter : Presenter<IPersonView>
{
private readonly IPersonController _controller;

public PersonPresenter(IPersonController controller)
{
_controller
= controller;
}

public override void OnViewInitialized()
{
View.Persons
= _controller.GetPersons();
}

public override void Save()
{
//do something
}
}

  等等,怎么会突然冒出个IPersonController,这个接口干嘛的?重点来啦,presenter凭什么可以承担起UI的所有逻辑,就是因为有这个IPersonController接口,这个接口的主要职责是通过您的Data Layer获得presenter完成UI逻辑所需要的数据,它是presenter的强大靠山。在这个例子中,IPersonController获得person列表,来给赋给View的Persons属性,当然还做一些保存的动作(Save()).

 

  接下来我还要做一件很有意义的事情,就是创建一个抽象的基础页面类:

  

public abstract class ViewBasePage<TPresenter, TView> : Page,IMvpView
where TPresenter : Presenter<TView>
where TView : IMvpView
{
protected TPresenter _presenter;

public TPresenter Presenter
{
set
{
_presenter
= value;
_presenter.View
= (IMvpView)(object)this;
}
}
}

  所有UI都会继承这个类,虽然它现在所做的事情很简单(仅仅是做范例),当然你还可以加一些在其它界面都会用到的方法或者属性来增强这个基类。

 

  在这个例子中,我没有去实现Data Layer和controller,当然这也不是本文的重点,我希望通过这篇文章,让学习MVP模式的朋友,能对MVP模式有一个新的认识。  

 

 

  

 

    

posted @ 2010-04-17 10:34  JerryKai  阅读(2194)  评论(16编辑  收藏  举报