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. WebService技术规则

    1.基于web的系统级接口规范     - 一个普通适用标准 :http+xml     - 任何网络通信的操作系统     - 自包含.自描述.模块化     - 发布.定位.通过web调用  2. ...

  2. LevelDB深入浅出之整体架构

    LevelDB是一个可持久化的KV数据库引擎,由Google传奇工程师Jeff Dean和Sanjay Ghemawat开发并开源.无论从设计还是代码上都可以用精致优雅来形容,非常值得细细品味.本文将 ...

  3. C++ transform for_each

    #include<iostream>#include<vector>#include <list>#include <algorithm>#includ ...

  4. 一百三十四:CMS系统之版块管理二

    编辑 html,将数据渲染到tr上,方便js取值 js //编辑板块$(function () { $('.edit-board-btn').click(function (event) { var ...

  5. Linux命令之date

    date [选项] [格式] date [-u|--utc|--universal] [MMDDhhmm[[CC]yy][.ss]] date命令根据指定格式显示当前时间或设置系统时间.很多shell ...

  6. ubuntu报错解决和注意事项

    1.在容器中安装expect报错 [root@kube-node3 target]# docker exec -it 36563e55c42b sh$ sudo apt-get install exp ...

  7. [leetcode_easy]558. Quad Tree Intersection

    problem 558. Quad Tree Intersection re 1. Leetcode_easy_558. Quad Tree Intersection; 2. Grandyang; e ...

  8. Flutter Widget框架概述

    Flutter Widget采用现代响应式框架构建,这是从 React 中获得的灵感,中心思想是用widget构建你的UI. Widget描述了他们的视图在给定其当前配置和状态时应该看起来像什么.当w ...

  9. 基于c开发的全命令行音频播放器

    cmus是一个内置了音频播放器的强大的音乐文件管理器.用它的基于ncurses的命令行界面,你可以浏览你的音乐库,并从播放列表或队列中播放音乐,这一切都是在命令行下. Linux上安装cmus 首先, ...

  10. Blynk系列随笔

    Blynk系列随笔 1.基于Blynk服务器搭建物联网测试Demo 2.本地 Blynk服务器搭建