MVP Framework для winforms - PullRequest
       1

MVP Framework для winforms

19 голосов
/ 29 июля 2011

Я работаю в новом проекте и хочу реализовать шаблон MVP.Есть рамки для winforms, которые используют этот шаблон?Я проверил CAB, но мой проект не сложен для его реализации, я ищу что-то более простое в реализации и использовании.

Спасибо!

Ответы [ 2 ]

38 голосов
/ 29 июля 2011

Если вы ищете что-то простое ... , тогда вам действительно не нужен фреймворк . Вы можете бросить свой собственный шаблон 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);
      }
   }
}

Мне очень нравятся вещи Джереми Миллера. И я использовал Smart Client Software Factory ... но это касается решения очень больших сложных проблем. Существует так много других шаблонов, которые затмевают простоту шаблона MVP для начала.

Начните с простого, и когда вы начнете сталкиваться с трудностями, вы можете начать добавлять такие вещи, как локаторы служб и агрегаторы событий.

Шаблон MVP действительно очень прост в реализации. Надеюсь, это поможет вам быстрее начать работу.

Приветствия
Джош

4 голосов
/ 29 июля 2011

Это не фреймворк, но я прочитал бы серию Build Your Own Cab Джереми Миллера, прежде чем заняться дизайном.Он охватывает различные шаблоны представления в WinForms.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...