我需要你帮助才能理解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);
}
答案 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