Подтвердить что ты не робот

MVP Framework для winforms

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

Спасибо!

4b9b3361

Ответ 1

Если вы ищете что-то простое... , то вам действительно не нужна фреймворк. Вы можете свернуть собственный шаблон 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 действительно очень тривиален для реализации. Надеюсь, это поможет быстрее ускорить работу.

Cheers,
Джош

Ответ 2

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