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

posted @ 2017-09-29 17:04  白羽轻飘  阅读(466)  评论(0编辑  收藏  举报