我是MVP-PV模式的新手,对如何处理模型有一些疑问。 (我在应用程序中使用简单的CRUD语句,而不是EF)模型是否包含用于检索数据的CRUD或仅包含模型的属性。你在哪里实例化模型?在与Presenter一起传递的视图中?在演示者的顶部?在每种方法中?
以下是我正在使用MVP做的一个简单示例。
UserControl的添加方式如下:
ElementView uControl = new ElementView()
uControl.Location = new Point(0, 0);
uControl.Dock = DockStyle.Fill;
rPanel.Controls.Add(uControl);
界面:
namespace MPVExample.View
{
public interface IElementView
{
int IElementPKey { get; set; }
string INumber { get; set; }
string IDescription { get; set; }
event EventHandler<EventArgs> OnEditElement;
}
}
观点:
namespace MPVExample.View
{
public partial class ElementView : UserControl, IElementView
{
private ElementPresenter presenter = null;
public event EventHandler<EventArgs> OnEditElement;
public int IElementPKey
{
get { return TxtElementKey.Text; }
set { TxtElementKey.Text = value; }
}
public string INumber
{
get { return TxtNumber.Text; }
set { TxtNumber.Text = value; }
}
public string IDescription
{
get { return TxtDescription.Text; }
set { TxtDescription.Text = value; }
}
public ElementView ()
{
presenter = new ElementPresenter(this);
InitializeComponent();
}
private void BtnEdit_Click(object sender, EventArgs e)
{
OnEditElement?.Invoke(this, EventArgs.Empty);
}
}
}
演示者:
namespace MPVExample.Presenter
{
public class ElementPresenter
{
private readonly IElementViewView;
//ElementModel Model = new ElementModel (); //Instantiate Here?
public ElementPresenter(IElementView view)
{
try
{
if (view != null)
{
View = view;
Initialize();
}
else
{
throw new ArgumentNullException("IElementView");
}
}
catch (Exception ex)
{
//Log Error
}
}
private void Initialize()
{
try
{
View.OnEditElement += Edit_Element;
}
catch (Exception ex)
{
//Log Error
}
}
private void Edit_Element(object sender, EventArgs e)
{
try
{
ElementModel model = new ElementModel(); //Instantiate Here?
Model.ElementPKey = View.IElementPKey;
Model.Number = Convert.ToByte(View.INumber);
Model.Description = View.IDescription;
Model.Edit();
}
catch (Exception ex)
{
//Log Error
}
}
}
}
模特:
namespace MPVExample.Models
{
public class ElementModel
{
public int ElementPKey { get; set; }
public byte Number { get; set; }
public string Description { get; set; }
public void Edit() //Does this belong in here?
{
//SQL to Edit record
}
public void Save() //Does this belong in here?
{
//SQL to Save record
}
public void Get() //Does this belong in here?
{
//SQL to Get record
}
public void Delete() //Does this belong in here?
{
//SQL to Delete record
}
}
}
答案 0 :(得分:0)
模型应在演示者中初始化。最好在一个地方初始化它,并在演示者中的任何地方使用它。视图可以调用presenter方法以及所需的参数(主要来自GUI元素)。在presenter方法中,传递了所有参数,您可以使用它并与模型对象交互并执行获取,编辑,保存,删除操作。如果您需要将模型中的更改更新到视图,则需要在调用presenter中的方法的模型中使用方法,这些方法将调用视图中的方法,这会带来UI更新。
对于初学者来说,这可能令人困惑。简而言之,每个演示者都会引用它的视图以及模型。 每个视图都会引用它的演示者。 每个模型都会引用演示者,而不是视图。这样,您可以在应用程序的各个层之间实现松散耦合。
https://github.com/HewittVS/MVP-Pattern-CSharp
我已附加到我的github存储库的链接,其中包含使用MVP模式的示例应用程序。但我没有太多使用模型。您可以看到我们可以根据演示者方法调用在多大程度上更改实际的UI事件方法。祝你好运的伙伴:)