1 简介mvp模式
阅读原文时间:2023年07月13日阅读:1

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

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

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

public partial class Default : System.Web.UI.Page
{
//表示器干了所有的事情
public IPresent 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>接口的请求时使用RSVPPresenter类
//bind方法返回的对象可以将RSVPPresenter关联为要使用的实现
//每次收到一个IPresent>的请求,就创建RSVPPresenter的一个新的实例
kernel.Bind>().To();

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

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章