我现在完全理解 MVP 模式,但我仍然很难看到视图和演示者的实例化位置。我已经看到了一些演示者在视图中更新的示例,但这是正确的。在阅读了 Jeremy Miller 关于 View 和 Presenter 之间通信的博客文章后,他在 Presenter 上有一个功能,可以将 Presenter 附加到视图。
那么我的问题是:应该在哪里创建视图和演示者?也在winforms和webforms中。
在 web 表单中,页面由请求实例化。由于页面是视图并且您无法控制执行顺序,因此视图必须向演示者注册自身
在 Winforms 中,我根据需要实例化视图(例如:在main
方法中,或在另一个演示者的方法中,但在任何地方都有意义)。然后视图创建并注册一个新的演示者实例。
这使得让多个视图使用相同的演示者逻辑变得容易,并且使我的视图的用户免受我使用 MVP 的特定架构决策的影响。
首先是好问题。其次,它可能并不重要。我个人的偏好是几乎总是在视图中连接演示者和视图。
比较这个场景:
public class SomePresenter
{
public ShowContactView(IContactView view)
{
IContact model = new Contact();
new ContactPresenter(model, view);
view.Show();
}
}
public class AnotherPresenter
{
public ShowContactView(IContactView view)
{
IContact model = new Contact();
new ContactPresenter(model, view);
view.Show();
}
}
public class YetAnotherPresenter
{
public ShowContactView(IContactView view)
{
IContact model = new Contact();
new ContactPresenter(model, view);
view.Show();
}
}
public partial class ContactView : Form, IContactView
{
public ContactView()
{
InitializeComponent();
}
}
对此:
public class SomePresenter
{
public ShowContactView(IContactView view)
{
view.Show();
}
}
public class AnotherPresenter
{
public ShowContactView(IContactView view)
{
view.Show();
}
}
public class YetAnotherPresenter
{
public ShowContactView(IContactView view)
{
view.Show();
}
}
public partial class ContactView : Form, IContactView
{
public ContactView()
{
InitializeComponent();
new ContactPresenter(new Contact(), this);
}
}
如您所见,后者的代码重复要少得多。当然这是愚蠢的重复,或者您可以说您可以将通用功能移动到共享功能,但您明白了,这只是一个示例。那时您将在应用程序的多个部分实例化相同的视图。
此外,View 知道 Presenter 的好处是你只需要在你的 View 项目中引用 Presenter,这样你就可以在不同的 UI 应用程序中重复使用同一个 Presenter。否则,您将需要在 Presenter 中引用每个 View 项目。
但更重要的是看看不同的模型如何适合你的情况。老实说,甚至还有更多的可能性。请参阅这个重复的问题。