【问题标题】:MVP Framework for winformswinforms的MVP框架
【发布时间】:2011-10-15 23:59:04
【问题描述】:

我正在一个新项目中工作,我想实现 MVP 模式。有使用这种模式的winforms框架吗?我检查了 CAB,但我的项目实施起来并不复杂,我正在寻找更易于实施和使用的东西。

谢谢!

【问题讨论】:

  • 我认为迁移到 WPF 而不是使用旧的 Winform 将是一个明智的选择。在 wpf 或 silverlight 中实现 MVP 模式很容易。
  • 您是否考虑过使用 Microsoft 的 Smart Client Software Factory:msdn.microsoft.com/en-us/library/ff648753.aspx
  • Winforms - MVP examples的可能重复
  • 好吧,我想使用 WPF,但要求是针对 Winforms,另一个问题是我使用没有实现 WPF 的 VS 2005。智能客户端实现了很多不适用于项目的东西(它不是那么复杂)我正在寻找更实用的东西。

标签: c# winforms .net-2.0 mvp


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    如果您正在寻找简单的东西... 那么您真的不需要框架。您可以推出自己的 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 模式实现起来非常简单。我希望这可以帮助您更快地开始跑步。

    干杯,
    乔什

    【讨论】:

    • PresenterModel有什么区别?
    • 嗨乔希,感谢您的帮助。考虑到这不是一个复杂的项目,最好以使用框架的方式实现它。!!
    • @Sung - Presenter 只负责在模型和视图之间来回封送事件和数据。在上面的例子中没有模型,但这并不是说你不应该有一个。在您使用足够多的 UI 设计模式之后,您将开始了解到它们基本上都在做同样的事情,只是有细微的变化。 MVC、MVP 和 MVVM 密切相关。
    • 嗨 Josh,我如何在视图中表示 datagridview 或组合框?
    • @Neo - 啊...我认为您所看到的是通用类型约束。 where TView : class, IView 这只是说明当有人创建一个具体的 Presenter 时,它必须有一个实现 IView 的属性。 msdn.microsoft.com/en-us/library/d5x73970.aspx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-06
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-14
    相关资源
    最近更新 更多