MVP Framework for winforms
本文关键字:winforms for Framework MVP | 更新日期: 2023-09-27 18:03:51
我在一个新项目工作,我想实现MVP模式。有一个框架的winforms使用这种模式?我检查了CAB,但我的项目实现起来并不复杂,我寻找一些更简单的实现和使用。
谢谢!
如果你正在寻找一些简单的…,那么你真的不需要一个框架。你可以滚动你自己的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中的各种表示模式。