winform的MVP框架

fca*_*rtu 19 c# mvp .net-2.0 winforms

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

谢谢!

Jos*_*osh 38

如果你正在寻找简单的东西...... 那么你真的不需要一个框架.你可以推出自己的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;
}
Run Code Online (Sandbox Code Playgroud)

这就是您开始使用的全部内容.然后,您可以定义新视图以满足您的需求.

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

   event EventHandler SavePerson;
}
Run Code Online (Sandbox Code Playgroud)

创建使用该视图的演示者.

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);
   }
}
Run Code Online (Sandbox Code Playgroud)

最后以新的形式使用它.

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);
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我非常喜欢Jeremy Miller的东西.我使用过智能客户端软件工厂......但这些都是为了解决非常复杂的问题.混合了许多其他模式,它开始掩盖了MVP模式的简单性.

从简单开始,当您开始遇到困难时,您就可以开始添加服务定位器和事件聚合器等内容.

MVP模式实现起来非常简单.我希望这可以帮助您更快地开始运行.

干杯,
乔希

  • @Sung - Presenter仅负责在模型和视图之间来回封送事件和数据.在上面的例子中没有模型,但这并不是说你不应该有一个模型.在您充分使用UI设计模式后,您将开始了解它们基本上都是以微妙的变化做同样的事情.MVC,MVP和MVVM密切相关. (3认同)