[英]C# Winforms MVP-Passive View, where to handle the Model?
我是MVP-PV類型模式的新手,並且對如何處理模型有一些疑問。 (我在應用程序中使用的是簡單的CRUD語句,而不是EF)模型是否包含用於檢索數據的CRUD或僅包含模型的屬性。 您在哪里實例化模型? 在與主持人一起通過的視圖中? 在主持人的頂部? 每種方法?
這是我使用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
}
}
}
模型應該在演示者中初始化 。 最好在一個地方初始化它,然后在演示者中的任何地方使用它。 視圖可以調用presenter方法以及所需的參數(主要來自GUI元素)。 在presenter方法內部,傳遞了所有參數后,您可以使用它並與模型對象進行交互,並執行獲取,編輯,保存,刪除操作。 如果需要將模型中的更改更新到視圖,則需要在調用presenter中的方法的模型中具有一些方法,這些方法將依次在視圖中調用帶來UI更新的方法。
對於初學者來說,這可能會令人困惑。 簡而言之, 每個演示者都將對其視圖以及模型都有參考。 每個視圖都將單獨引用它的演示者 。 每個模型將僅引用演示者 ,而不引用視圖。 這樣,您可以在應用程序的各個層之間實現松散耦合。
https://github.com/HewittVS/MVP-Pattern-CSharp
我已將鏈接附加到我的github存儲庫,其中包含使用MVP模式的示例應用程序。 但是我沒有太多使用模型。 您可以看到我們可以在演示者方法調用方面更改實際的UI事件方法。 祝你好運:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.