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,我将发送源代码一起讨论,本人菜鸟初做笔记,欢迎指导。

1 简介mvp模式的更多相关文章

  1. Xamarin.Android MVP模式

    一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...

  2. Android开发MVP模式解析

    http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...

  3. Java(Android)编程思想笔记03:在Android开发中使用MVP模式

    1. MVP模式简介: MVC模式相信大家肯定是比较熟悉的:M-Model-模型.V-View-视图.C-Controller-控制器. MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M- ...

  4. android MVP模式简单介绍

    原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...

  5. android的MVP模式

    MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...

  6. [译]Google官方关于Android架构中MVP模式的示例

    概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...

  7. Android MVP模式 谷歌官方代码解读

    Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...

  8. 在Andoid开发中使用MVP模式来解耦,增加可测试性

    by Jeff Angelini posted on 7/20/2011 2:35:00 PM 将应用程序UI的表现从Ui的逻辑中分离是一个好的想法.这种分离减少了代码耦合,代码更加干净, 甚至可以有 ...

  9. MVP模式(Android)

    以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...

随机推荐

  1. Web前端学习笔记——Canvas

    <!DOCTYPE html> <html lang="en"> <head>     <meta charset="UTF-8 ...

  2. LocalDB数据库修改排序规则,修复汉字变问号

    VS中新增的轻量级数据库LocalDB,有个这个,开发人员就不必再安装庞大的SQL server了,可以方便地测试运行小型项目:既然是轻量级数据库,它抛弃了庞大的身躯,功能上当然也会受到局限,其中之一 ...

  3. Google Directions API 中路线编码解析

    public List<Location> GetGeoPoints(string encoded) { List<Location> poly = new List<L ...

  4. opencv C++ mask_rcnn

    #include <fstream> #include <sstream> #include <iostream> #include <string.h> ...

  5. 如何不让Excel图表随源数据改变而改变

    如何不让Excel图表随源数据改变而改变 一般我们在用Excel时,经常会碰到一些问题,比如,如何才能不让Excel图表随源数据改变而改变呢,下面就谈一下,一般在默认情况下,Excel的图表在一个区域 ...

  6. Delphi repeat Until 运用

    procedure TForm3.SpeedButton1Click(Sender: TObject); Var I:integer; begin I:=; repeat I:=I+; ; ShowM ...

  7. python进阶--多线程多进程

    一.线程和进程 进程是拥有独立内存,能够独立运行的最小单位,也是程序执行的最小单位,线程是程序运行过程中,一个单一的顺序控制流程,是程序执行流的最小单位,一个进程至少包含一个线程,多线程共享进程的内存 ...

  8. jprofile 远程监控linux上的jvm

    环境 客户端:win7+jprofiler_windows-x64_10_0_4.exe linux服务器:tomcat7+jdk1.7+jprofiler_linux_10_0_4.sh 一.客户端 ...

  9. python之selenium玩转鼠标操作(ActionChains)

    前提: 一般人用selenium自动化时,会用到模拟鼠标操作的情况,像单击,双击,右击,左击啊等,这个时候我们就要用到ActionChains了. 内容: 1.ActionChains用法整理 cli ...

  10. 【AMAD】django-channels -- 为Django带来异步开发

    动机 简介 个人评分 动机 目前web生态的发展带来了很多异步特性,比如websocket.而原生Django并不支持. 简介 django-channels1为Django带来了Websocket, ...