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

  • 相关阅读:
    CGAffineTransform的使用大概:
    CYLTabBarController的简单使用
    Masonry详解
    Swift学习 (四)
    《Advanced Bash-scripting Guide》学习(二):测试脚本调用的参数是否正确
    《Advanced Bash-scripting Guide》学习(一):对一个增强和广义的删除logfile的脚本的理解
    [JSOI2007]字符加密Cipher
    codevs 3160 最长公共子串
    codevs 1500 后缀排序
    浅谈后缀数组
  • 原文地址:https://www.cnblogs.com/mibing/p/7607708.html
Copyright © 2011-2022 走看看