1 模型-视图-表示器也称为监视控制器模式 ,如下图表示
2 mvp 模式希望通过表示器(presenter)来关联网页,而不必在他们之间建立严格的
3 一个简单的mvp架构的例子
public partial class Default : System.Web.UI.Page { //表示器干了所有的事情 public IPresent<GuestResponse> presenter { get; set; } protected void Page_Load(object sender, EventArgs e) { //创建具体的表示器 presenter = new RSVPPresenter { repository=new MemoryRepository()}; if (IsPostBack) { //得到一个模型 GuestResponse rsvp= ((DataResult<GuestResponse>)presenter.GetResult()).DataItem; if (TryUpdateModel(rsvp,new FormValueProvider(ModelBindingExecutionContext))) { Response.Redirect(((RedirectResult)presenter.GetResult(rsvp)).Url); } } } }
当web窗体提交时我们先初始化一个具体的表示器实例,并把这个实例要处理的模型与它具体的模型类关联起来,看起来是吧web窗体的请求全部交给表示器presenter来处理,实际上这还是一种硬编码。
4 如何隔离这些硬编码呢?使用依赖注入来隔离这些组件,也称为控制反转
使用DI容器:这是一个软件组件负责在需要时实例化实现类
以ninject为例,首先通过nuget安装ninject.web程序包
安装成功之后的效果
将依赖注入的配置信息存放到单独的类中
public static class DIConfiguration { public static void SetupDI(IKernel kernel) { //告诉ninject收到IPresent<GuestResponse>>接口的请求时使用RSVPPresenter类 //bind方法返回的对象可以将RSVPPresenter关联为要使用的实现 //每次收到一个IPresent<GuestResponse>>的请求,就创建RSVPPresenter的一个新的实例 kernel.Bind<IPresent<GuestResponse>>().To<RSVPPresenter>(); //告诉ninject它应使用MemoryRepository的单一实例来响应IRepository接口的所有请求 kernel.Bind<IRepository>().To<MemoryRepository>().InSingletonScope(); } }
然后注册:
/// <summary> /// Load your modules or register your services here! /// </summary> /// <param name="kernel">The kernel.</param> private static void RegisterServices(IKernel kernel) { DIConfiguration.SetupDI(kernel); }
配置:
//当ninject在类中遇到inject特性时,Ninject知道需要创建指定的IRepository接口实现的实例,然后将其分配给 //repository属性 [Ninject.Inject] public IRepository repository { get; set; } public IResult GetResult() { return new DataResult<GuestResponse>(new GuestResponse()); }
分离后的mvp示例程序如下
public partial class Default : System.Web.UI.Page { //表示器干了所有的事情 [Ninject.Inject] public IPresent<GuestResponse> presenter { get; set; } protected void Page_Load(object sender, EventArgs e) { //创建具体的表示器 // presenter = new RSVPPresenter { repository=new MemoryRepository()}; if (IsPostBack) { //得到一个模型 GuestResponse rsvp= ((DataResult<GuestResponse>)presenter.GetResult()).DataItem; if (TryUpdateModel(rsvp,new FormValueProvider(ModelBindingExecutionContext))) { Response.Redirect(((RedirectResult)presenter.GetResult(rsvp)).Url); } } } }
到这里基本的asp.net mvp基本的架构就解释完了,如果想一起讨论学习的加qq947219743,我将发送源代码一起讨论,本人菜鸟初做笔记,欢迎指导。
时间: 2024-10-09 09:03:24