Я изучаю применение MVP к простому приложению WinForms (только одна форма) на C# и столкнулся с проблемой при создании главного ведущего в static void Main()
. Является ли хорошей идеей выставить представление из презентатора, чтобы предоставить его в качестве параметра Application.Run()?Как вызывать Application.Run() для основного ведущего приложения MVP WinForms?
В настоящее время я реализовал подход, который позволяет мне не подвергать View как свойство Выступающий:
static void Main()
{
IView view = new View();
Model model = new Model();
Presenter presenter = new Presenter(view, model);
presenter.Start();
Application.Run();
}
пуска и останова методы в Выступающий:
public void Start()
{
view.Start();
}
public void Stop()
{
view.Stop();
}
The Start и Stop в представлении (форма Windows):
public void Start()
{
this.Show();
}
public void Stop()
{
// only way to close a message loop called
// via Application.Run(); without a Form parameter
Application.Exit();
}
Вызов Application.Exit() кажется неэлегантным способом закрыть форму (и приложение). Другой альтернативой было бы разоблачить представление как общедоступное свойство Ведущего, чтобы вызвать Application.Run() с параметром Form.
static void Main()
{
IView view = new View();
Model model = new Model();
Presenter presenter = new Presenter(view, model);
Application.Run(presenter.View);
}
Методы «Пуск» и «Стоп» в Presenter остаются неизменными. Дополнительное свойство добавлено вернуть вид как форма:
public void Start()
{
view.Start();
}
public void Stop()
{
view.Stop();
}
// New property to return view as a Form for Application.Run(Form form);
public System.Windows.Form View
{
get { return view as Form(); }
}
пуска и останова методы View (в форме Windows) затем записывается, как показано ниже:
public void Start()
{
this.Show();
}
public void Stop()
{
this.Close();
}
Может кто-нибудь предложить, какие лучший подход и почему? Или есть еще лучшие способы решения этой проблемы?
Я благодарю Роджер, Heinzi и Николь за их ценный вклад, но я выбрал ответ Heinzi, наконец, потому, что я приспособил его ответ для моего фактического применения с использованием двух дополнительных интерфейсов IMainPresenter и IMainView. – anonymous