C#Winforms MVP-Passive View,在哪里处理模型?

时间:2018-02-23 19:06:07

标签: c# winforms model mvp

我是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
        }
    }
}

1 个答案:

答案 0 :(得分:0)

模型应在演示者中初始化。最好在一个地方初始化它,并在演示者中的任何地方使用它。视图可以调用presenter方法以及所需的参数(主要来自GUI元素)。在presenter方法中,传递了所有参数,您可以使用它并与模型对象交互并执行获取,编辑,保存,删除操作。如果您需要将模型中的更改更新到视图,则需要在调用presenter中的方法的模型中使用方法,这些方法将调用视图中的方法,这会带来UI更新。

对于初学者来说,这可能令人困惑。简而言之,每个演示者都会引用它的视图以及模型每个视图都会引用它的演示者每个模型都会引用演示者,而不是视图。这样,您可以在应用程序的各个层之间实现松散耦合。

https://github.com/HewittVS/MVP-Pattern-CSharp

我已附加到我的github存储库的链接,其中包含使用MVP模式的示例应用程序。但我没有太多使用模型。您可以看到我们可以根据演示者方法调用在多大程度上更改实际的UI事件方法。祝你好运的伙伴:)