1   模型-视图-表示器也称为监视控制器模式 ,如下图表示

2 mvp 模式希望通过表示器(presenter)来关联网页,而不必在他们之间建立严格的

3 一个简单的mvp架构的例子

  1. public partial class Default : System.Web.UI.Page
  2. {
  3. //表示器干了所有的事情
  4. public IPresent<GuestResponse> presenter { get; set; }
  5.  
  6. protected void Page_Load(object sender, EventArgs e)
  7. {
  8. //创建具体的表示器
  9. presenter = new RSVPPresenter { repository=new MemoryRepository()};
  10. if (IsPostBack)
  11. {
  12. //得到一个模型
  13. GuestResponse rsvp= ((DataResult<GuestResponse>)presenter.GetResult()).DataItem;
  14.  
  15. if (TryUpdateModel(rsvp,new FormValueProvider(ModelBindingExecutionContext)))
  16. {
  17. Response.Redirect(((RedirectResult)presenter.GetResult(rsvp)).Url);
  18. }
  19. }
  20. }
  21. }

当web窗体提交时我们先初始化一个具体的表示器实例,并把这个实例要处理的模型与它具体的模型类关联起来,看起来是吧web窗体的请求全部交给表示器presenter来处理,实际上这还是一种硬编码。

4 如何隔离这些硬编码呢?使用依赖注入来隔离这些组件,也称为控制反转

使用DI容器:这是一个软件组件负责在需要时实例化实现类

以ninject为例,首先通过nuget安装ninject.web程序包

安装成功之后的效果

将依赖注入的配置信息存放到单独的类中

  1. public static class DIConfiguration
  2. {
  3. public static void SetupDI(IKernel kernel)
  4. {
  5. //告诉ninject收到IPresent<GuestResponse>>接口的请求时使用RSVPPresenter类
  6. //bind方法返回的对象可以将RSVPPresenter关联为要使用的实现
  7. //每次收到一个IPresent<GuestResponse>>的请求,就创建RSVPPresenter的一个新的实例
  8. kernel.Bind<IPresent<GuestResponse>>().To<RSVPPresenter>();
  9.  
  10. //告诉ninject它应使用MemoryRepository的单一实例来响应IRepository接口的所有请求
  11. kernel.Bind<IRepository>().To<MemoryRepository>().InSingletonScope();
  12. }
  13.  
  14. }

然后注册:

  1. /// <summary>
  2. /// Load your modules or register your services here!
  3. /// </summary>
  4. /// <param name="kernel">The kernel.</param>
  5. private static void RegisterServices(IKernel kernel)
  6. {
  7. DIConfiguration.SetupDI(kernel);
  8. }

配置:

  1. //当ninject在类中遇到inject特性时,Ninject知道需要创建指定的IRepository接口实现的实例,然后将其分配给
  2. //repository属性
  3. [Ninject.Inject]
  4. public IRepository repository { get; set; }
  5. public IResult GetResult()
  6. {
  7. return new DataResult<GuestResponse>(new GuestResponse());
  8. }

分离后的mvp示例程序如下

  1. public partial class Default : System.Web.UI.Page
  2. {
  3. //表示器干了所有的事情
  4. [Ninject.Inject]
  5. public IPresent<GuestResponse> presenter { get; set; }
  6.  
  7. protected void Page_Load(object sender, EventArgs e)
  8. {
  9. //创建具体的表示器
  10. // presenter = new RSVPPresenter { repository=new MemoryRepository()};
  11. if (IsPostBack)
  12. {
  13. //得到一个模型
  14. GuestResponse rsvp= ((DataResult<GuestResponse>)presenter.GetResult()).DataItem;
  15.  
  16. if (TryUpdateModel(rsvp,new FormValueProvider(ModelBindingExecutionContext)))
  17. {
  18. Response.Redirect(((RedirectResult)presenter.GetResult(rsvp)).Url);
  19. }
  20. }
  21. }
  22. }

到这里基本的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. python之Anaconda python3.7安装

    1.下载 https://www.anaconda.com/distribution/ #你会发现,使用windows下载十分慢,既然这样,为何不尝试centos(linux)安装呢?本人使用cent ...

  2. Linux 文件操作相关常用命令

    1.创建文件夹 [root@izwz9148jq0xmzrb36r113z 20190726]# mkdir aaa //创建aaa文件夹 2.创建文件 [root@izwz9148jq0xmzrb3 ...

  3. mysql主从数据一致性校验和修复

    1. 安装 yum install -y perl-IO-Socket-SSL.noarch perl-Digest-MD5 yum -y install http://www.percona.com ...

  4. delphi 中如何从数据库中读取数据自生成TreeView,只有两个字段,数据库结构如下。急急!!

    我的数据库结构如下:UnitId      UnitName01          中国 (根节点)0101        河北省(二级树)010101      河北省沧州市(三级树)0101010 ...

  5. Java实现汉诺塔移动,只需传一个int值(汉诺塔的阶)

    public class HNT { public static void main(String[] args) { HNT a1 = new HNT(); a1.lToR(10); //给汉诺塔a ...

  6. 思科S系列220系列交换机多个漏洞预警

    补天漏洞响应平台近期监测思科官方发布了关于思科 S 系列 220 系列交换机的3个漏洞修复通告,其中包含2个高危漏洞,最高CVSS 3.0评分9.8. 更新时间 2019年 08月 09日 威胁目标 ...

  7. 【VS开发】winsock 错误多 windows.h和winsock2.h的顺序

    Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误.诸如: c:\program files ...

  8. 【VS开发】图像颜色

    版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg1259156776/. 最近被图像颜色整的乱七八糟的,一会儿YUV422,一会儿RGB,一会儿gray... ...

  9. MemCache服务安装配置及windows下修改端口号

    简述:memcached 开源的分布式缓存数据系统.高性能的NOSQL Linux 一.环境配置与安装 01.编译准备环境 yum install -y gcc make cmake autoconf ...

  10. 记一次 vmware ESXI 升级

    旧服务器的esxi版本为 60(6765062),计划安装成为最新版 的为ESXI 60  (14513180),中间波折遇坑多次,现记录如下: 一.开启ESXI的SSH 访问权限(可以通过按F2进入 ...