我正在学习在C#中将MVP应用到一个简单的WinForms应用程序(只有一个表单),并在创建主要演示者时遇到问题static void Main().从Presenter公开View以将其作为参数提供给Application.Run()是一个好主意吗?
目前,我已经实现了一种方法,允许我不将View作为Presenter的属性公开:
static void Main()
{
IView view = new View();
Model model = new Model();
Presenter presenter = new Presenter(view, model);
presenter.Start();
Application.Run();
}
Run Code Online (Sandbox Code Playgroud)
Presenter中的Start和Stop方法:
public void Start()
{
view.Start();
}
public void Stop()
{
view.Stop();
}
Run Code Online (Sandbox Code Playgroud)
View中的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();
}
Run Code Online (Sandbox Code Playgroud)
Application.Exit()调用似乎是一种关闭Form(和应用程序)的不雅方式.另一种方法是将View作为Presenter的公共属性公开,以便使用Form参数调用Application.Run().
static void Main()
{
IView view = new View();
Model model = new Model();
Presenter presenter = new Presenter(view, model);
Application.Run(presenter.View);
}
Run Code Online (Sandbox Code Playgroud)
Presenter中的Start和Stop方法保持不变.添加了一个附加属性以将视图作为表单返回:
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(); }
}
Run Code Online (Sandbox Code Playgroud)
View中的Start和Stop方法(Windows窗体)将按如下方式编写:
public void Start()
{
this.Show();
}
public void Stop()
{
this.Close();
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以建议哪种方法更好,为什么?或者有更好的方法来解决这个问题?
以下内容如何:
// view
public void StartApplication() // implements IView.StartApplication
{
Application.Run((Form)this);
}
// presenter
public void StartApplication()
{
view.StartApplication();
}
// main
static void Main()
{
IView view = new View();
Model model = new Model();
Presenter presenter = new Presenter(view, model);
presenter.StartApplication();
}
Run Code Online (Sandbox Code Playgroud)
这样,您就不需要将视图暴露给外部.此外,视图和演示者都知道这个视图已经作为"主要形式"开始,这可能是一个有用的信息.
我会选择第二种方法.您还可以通过简单地将视图转换为void Main中的表单来消除额外的属性,因为您知道它在那时仍然是一个表单(我认为没有理由使它更通用,因为它只是启动winform app )
Application.Run(view as Form);
Run Code Online (Sandbox Code Playgroud)