MVP Framework для winforms

18

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

Спасибо!

    
задан fcartu 29.07.2011 в 15:55
источник
  • Я думаю, что переезд в WPF вместо работы над старыми winforms был бы мудрым выбором. Легко реализовать шаблон MVP в wpf или silverlight. –  Matteo Mosca 29.07.2011 в 15:57
  • Вы задумывались над тем, чтобы использовать Smart Client Software Factory от Microsoft: msdn.microsoft.com/en-us/library/ff648753.aspx –  Kane 29.07.2011 в 15:58
  • возможный дубликат Winforms - примеры MVP –  stuartd 29.07.2011 в 16:01
  • Ну, я хочу использовать WPF, но требования для Winforms, другая проблема в том, что я использую VS 2005, который не реализует WPF. Smart Client реализует множество материалов, которые не относятся к проекту (его не так сложно), я искал что-то более практичное. –  fcartu 29.07.2011 в 16:09

2 ответа

34

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

    
ответ дан Josh 29.07.2011 в 16:51
источник
  • В чем разница между презентатором и моделью? –  Sung 29.07.2011 в 17:32
  • Привет, Джош, спасибо за вашу помощь. Лучше реализовать его таким образом, чтобы использовать фреймворк, учитывая, что это не сложный проект. !! –  fcartu 29.07.2011 в 19:46
  • @Sung - Ведущий отвечает только за марширование событий и данных между Моделью и Представлением. В приведенном выше примере нет модели, но это не значит, что у вас ее не должно быть. После того, как вы будете работать с шаблонами проектирования пользовательского интерфейса, вы начнете узнавать, что все они в основном делают то же самое с небольшими вариациями. MVC, MVP и MVVM очень тесно связаны. –  Josh 29.07.2011 в 20:07
  • Привет, Джош, как я могу представить представление datagridview или combobox внутри? –  fcartu 01.08.2011 в 16:11
  • @fcartu - Комбобокс довольно прост, так как это просто список некоторых базовых объектов. Любой IEnumerable <T> подходит для привязки. Чтобы получить текущий выбранный элемент, вы можете передать его через событие args или просто создать отдельное свойство на вашем представлении, которое представляет выбор. Сетки немного отличаются друг от друга, поскольку они в значительной степени предназначены для работы с ASP.Net-стилем разработки ... который далек от хорошего и проверяемого. Вероятно, стоит отдельный вопрос и ответ, поскольку этот комментарий недостаточно длинный, чтобы объяснить :) –  Josh 01.08.2011 в 16:21
Показать остальные комментарии
4

Это не фреймворк, но я бы прочитал «

    
источник
  • Привет Эрик, я проверю вашу ссылку, спасибо! –  fcartu 29.07.2011 в 16:25