MVP Framework for winforms

本文关键字:winforms for Framework MVP | 更新日期: 2023-09-27 18:03:51

我在一个新项目工作,我想实现MVP模式。有一个框架的winforms使用这种模式?我检查了CAB,但我的项目实现起来并不复杂,我寻找一些更简单的实现和使用。

谢谢!

MVP Framework for winforms

如果你正在寻找一些简单的…,那么你真的不需要一个框架。你可以滚动你自己的MVP模式。

编写基类只需要几分钟。

//Base Presenter Class  
public class Presenter<TView> where TView : class, IView {
   public TView View { get; private set; }
   public Presenter(TView view) {
      if (view == null)
         throw new ArgumentNullException("view");
      View = view;
      View.Initialize += OnViewInitialize;
      View.Load += OnViewLoad;
   }
   protected virtual void OnViewInitialize(object sender, EventArgs e) { }
   protected virtual void OnViewLoad(object sender, EventArgs e) { }
}
//Base View  
public interface IView {
   event EventHandler Initialize;
   event EventHandler Load;
}

这是所有你需要开始。然后你可以定义一个新的视图来满足你的需要。

public interface IPersonView : IView {
   String PersonName { get; set; }
   DateTime? DOB { get; set; }
   event EventHandler SavePerson;
}

创建一个使用视图的演示者。

public class PersonPresenter : Presenter<IPersonView> {
   private IPersonDb PersonDB { get; set; }
   public PersonPresenter(IPersonView view, IPersonDb personDB)
      : base(view) {
      if (personDB == null)
         throw new ArgumentNullException("personDB");
      PersonDB = personDB;
   }
   protected override void OnViewInitialize(object sender, EventArgs e) {
      base.OnViewInitialize(sender, e);
      View.PersonName = "Enter Name";
      View.DOB = null;
      View.SavePerson += View_SavePerson;
   }
   void View_SavePerson(object sender, EventArgs e) {
      PersonDB.SavePerson(View.PersonName, View.DOB);
   }
}

并最终以一种新的形式投入使用。

public partial class Form1 : Form, IPersonView {
   private PersonPresenter Presenter { get; set; }
   public Form1() {
      Presenter = new PersonPresenter(this, new PersonDb());
      InitializeComponent();
      InvokeInitialize(new EventArgs());
   }
   public string PersonName {
      get { return tbName.Text; }
      set { tbName.Text = value; }
   }
   public DateTime? DOB {
      get {
         return String.IsNullOrWhiteSpace(tbDOB.Text) ?
                  (DateTime?) null :
                  DateTime.Parse(tbDOB.Text);
      }
      set {
         tbDOB.Text = String.Format("{0}", value);
      }
   }
   public event EventHandler Initialize;
   public void InvokeInitialize(EventArgs e) {
      EventHandler handler = Initialize;
      if (handler != null) {
         handler(this, e);
      }
   }
   public event EventHandler SavePerson;
   public void InvokeSavePerson(EventArgs e) {
      EventHandler handler = SavePerson;
      if (handler != null) {
         handler(this, e);
      }
   }
}

我很喜欢Jeremy Miller的作品。我用过智能客户端软件工厂…但这些都是关于解决非常大的复杂问题。有这么多的其他模式混合在一起,它掩盖了MVP模式的简单性。

从简单开始,当你开始遇到困难时,你可以开始添加服务定位器和事件聚合器。

MVP模式实现起来非常简单。我希望这能帮助你更快地开始工作。

欢呼,
Josh

这不是一个框架,但我会在确定设计之前阅读Jeremy Miller的Build Your Own Cab系列。他介绍了WinForms中的各种表示模式。