1 简介mvp模式
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模式的更多相关文章
- Xamarin.Android MVP模式
一.简介 随着UI创建技术的功能日益增强,UI层也履行着越来越多的职责.为了更好地细分视图(View)与模型(Model)的功能,让View专注于处理数 据的可视化以及与用户的交互,同时让Model只 ...
- Android开发MVP模式解析
http://www.cnblogs.com/bravestarrhu/archive/2012/05/02/2479461.html 在开发Android应用时,相信很多同学遇到和我一样的情况,虽然 ...
- Java(Android)编程思想笔记03:在Android开发中使用MVP模式
1. MVP模式简介: MVC模式相信大家肯定是比较熟悉的:M-Model-模型.V-View-视图.C-Controller-控制器. MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M- ...
- android MVP模式简单介绍
原文 http://zhengxiaopeng.com/2015/02/06/Android%E4%B8%AD%E7%9A%84MVP/ 前言 MVP作为一种MVC的演化版本在Android开发中受到 ...
- android的MVP模式
MVP简介 相信大家对MVC都是比较熟悉了:M-Model-模型.V-View-视图.C-Controller-控制器,MVP作为MVC的演化版本,那么类似的MVP所对应的意义:M-Model-模型. ...
- [译]Google官方关于Android架构中MVP模式的示例
概述 该示例(TODO-MVP)是后续各种示例演变的基础,它主要演示了在不带架构性框架的情况下实现M-V-P模式.其采用手动依赖注入的方式来提供本地数据源和远程数据源仓库.异步任务通过回调处理. 注意 ...
- Android MVP模式 谷歌官方代码解读
Google官方MVP Sample代码解读 关于Android程序的构架, 当前(2016.10)最流行的模式即为MVP模式, Google官方提供了Sample代码来展示这种模式的用法. Repo ...
- 在Andoid开发中使用MVP模式来解耦,增加可测试性
by Jeff Angelini posted on 7/20/2011 2:35:00 PM 将应用程序UI的表现从Ui的逻辑中分离是一个好的想法.这种分离减少了代码耦合,代码更加干净, 甚至可以有 ...
- MVP模式(Android)
以前在写项目的时候,没有过多考虑架构模式的问题,因为之前一直做J2EE开发,而J2EE都是采用MVC模式进行开发的,所以在搭建公司项目的时候,也是使用类似MVC的架构(严格来讲,之前的项目还算不上MV ...
随机推荐
- python之Anaconda python3.7安装
1.下载 https://www.anaconda.com/distribution/ #你会发现,使用windows下载十分慢,既然这样,为何不尝试centos(linux)安装呢?本人使用cent ...
- Linux 文件操作相关常用命令
1.创建文件夹 [root@izwz9148jq0xmzrb36r113z 20190726]# mkdir aaa //创建aaa文件夹 2.创建文件 [root@izwz9148jq0xmzrb3 ...
- mysql主从数据一致性校验和修复
1. 安装 yum install -y perl-IO-Socket-SSL.noarch perl-Digest-MD5 yum -y install http://www.percona.com ...
- delphi 中如何从数据库中读取数据自生成TreeView,只有两个字段,数据库结构如下。急急!!
我的数据库结构如下:UnitId UnitName01 中国 (根节点)0101 河北省(二级树)010101 河北省沧州市(三级树)0101010 ...
- Java实现汉诺塔移动,只需传一个int值(汉诺塔的阶)
public class HNT { public static void main(String[] args) { HNT a1 = new HNT(); a1.lToR(10); //给汉诺塔a ...
- 思科S系列220系列交换机多个漏洞预警
补天漏洞响应平台近期监测思科官方发布了关于思科 S 系列 220 系列交换机的3个漏洞修复通告,其中包含2个高危漏洞,最高CVSS 3.0评分9.8. 更新时间 2019年 08月 09日 威胁目标 ...
- 【VS开发】winsock 错误多 windows.h和winsock2.h的顺序
Windows平台下用C++做网络开发很多时候都会同时包含这两个头文件,如若顺序不当(windows.h先于winsock2.h)就会出现很多莫名其妙的错误.诸如: c:\program files ...
- 【VS开发】图像颜色
版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/lg1259156776/. 最近被图像颜色整的乱七八糟的,一会儿YUV422,一会儿RGB,一会儿gray... ...
- MemCache服务安装配置及windows下修改端口号
简述:memcached 开源的分布式缓存数据系统.高性能的NOSQL Linux 一.环境配置与安装 01.编译准备环境 yum install -y gcc make cmake autoconf ...
- 记一次 vmware ESXI 升级
旧服务器的esxi版本为 60(6765062),计划安装成为最新版 的为ESXI 60 (14513180),中间波折遇坑多次,现记录如下: 一.开启ESXI的SSH 访问权限(可以通过按F2进入 ...