簡體   English   中英

C#Winforms MVP被動視圖,在哪里處理模型?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM