模型视图Presenter接口问题?

时间:2009-06-08 08:03:32

标签: c# .net asp.net asp.net-mvc

我需要你帮助才能理解MVP。我使用了一个接口(IProductEditorView)。如果你看下面你可以看到表示层:

using System;
using System.Collections.Generic;
using System.Text;
using MVPProject.BusinessLayer;

namespace MVPProject.PresentationLayer
{
    public interface IProductEditorView
    {
        int ProductID { get;}
        string ProductDescription { get; }

        event EventHandler<EventArgs> Save;
    }

    public class ProductEditorPresenter
    {
        private IProductEditorView mView;

        public ProductEditorPresenter(IProductEditorView view)
        {
            this.mView = view;
            this.Initialize();
        }

        private void Initialize()
        {
            this.mView.Save += new EventHandler<EventArgs>(mView_Save);
        }

        private void mView_Save(object sender, EventArgs e)
        {
            Product product;
            try
            {
                product = new Product();
                product.Description = mView.ProductDescription;
                product.ID = mView.ProductID;
                product.Save();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.Message);
                throw;
            }
        }
    }

}

如果你看下面就可以看到;这是混淆我的头,因为ProductListPresenter(IProductEditorView view)但他们要我添加(this)我不明白为什么this.mPresenter = new ProductListPresenter(this);”?

    private ProductListPresenter mPresenter;
    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        this.mPresenter = new ProductListPresenter(this);
    }

4 个答案:

答案 0 :(得分:1)

在ASP.NET页面的上下文中,视图“this”是“Page”。当我开始掌握MVP时,我发现Polymorphic Podcast series on MV Patterns非常有用。

答案 1 :(得分:0)

假设第二个代码块是后面的asp.net表单代码的一部分,那么我可以想象asp.net表单实现了IProductEditorView接口,因此您将视图(this)传递给演示者。 / p>

答案 2 :(得分:0)

假设代码的第二部分来自视图,那么您的MVP模式实现就会出现问题。

在您的设计中,演示者和视图都相互了解(Presenter在其构造函数中接受视图,视图在OnInit上设置其演示者)。

这是一个问题,因为您使用MVP来解耦视图和演示者,但这种设计使它们紧密耦合。您的演示者不需要知道您的视图,因此您可以从演示者构造函数中删除IProductEditorView参数。

然后,您需要将保存方法更改为:

private void Save(Product product)
{
    try
    {
        product.Save();
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine(ex.Message);
        throw;
    }
}

在您看来,当您需要保存产品时,请准备好并传递给演示者:

private btnSaveProduct_Click(object sender, EventArgs e)
{
    Product product;
    product.Description = txtDescription.Text;
    // Set other properties or the product
    this.mPresenter.Save(product);
}

你的观点的OnInit保持不变。

答案 3 :(得分:0)

我做MVP的方法是让演示者有一个名为Initialize的方法,它将视图作为参数。想到MVP的一种方法是演示者通过视图界面操纵视图。让我们举一个例子,当单击保存按钮的OnClick事件时,您希望presneter保存产品,而不是直接在页面后面的代码中包含此代码。你可以用这样的代码编写代码:

public class ProductEditorPresenter
{
    public void Initialize(IProductEditorView view, IProductBuilder productBuilder)
    {
       view.SaveProduct += delegate
                           {
                              var product = productBuilder.Create(view.ProductId, view.ProductDescription);
                              product.Save();
                           }
    }
}

productBuilder为您处理产品的创建。您确实希望尝试进行基于接口/契约的编程,而不是直接在类中创建具体对象。此外,杰里米·米勒(Jeremy Miller)创建了一个关于演示模式的维基,这可能对描述这种模式更有用。这可以看作here