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

  • 相关阅读:
    转-mysql中int、bigint、smallint 和 tinyint的区别详细介绍
    转-通用接口测试用例设计
    转-接口测试
    剑指offer 面试题43 n个骰子的点数 DP
    HYSBZ 1503 郁闷的出纳员 伸展树
    HYSBZ 1588 营业额统计 平衡二叉树模板
    剑指offer 面试题35 第一个只出现一次的字符
    LightOJ 1030 Discovering Gold 期望
    LightOJ 1027 A Dangerous Maze 概率期望
    剑指offer 面试题34 丑数
  • 原文地址:https://www.cnblogs.com/mibing/p/7607708.html
Copyright © 2011-2022 走看看