Winforms 应在何处查看&;演讲者出生
我现在完全理解MVP模式,但我仍然很难看到视图和演示者的实例化位置。我见过一些例子,演示者在视图中是新出现的,但这是正确的吗。在阅读了Jeremy Miller关于视图和演示者之间通信的博客文章后,他在演示者上有一个功能,可以将演示者附加到视图Winforms 应在何处查看&;演讲者出生,winforms,webforms,mvp,Winforms,Webforms,Mvp,我现在完全理解MVP模式,但我仍然很难看到视图和演示者的实例化位置。我见过一些例子,演示者在视图中是新出现的,但这是正确的吗。在阅读了Jeremy Miller关于视图和演示者之间通信的博客文章后,他在演示者上有一个功能,可以将演示者附加到视图 我的问题是:应该在哪里创建视图和演示者?另外,在winforms和webforms中。在webforms中,页面由请求实例化。由于页面是视图,您无法控制执行顺序,因此视图必须在Winforms中向演示者注册自己,我根据需要实例化视图(例如:在main方法
我的问题是:应该在哪里创建视图和演示者?另外,在winforms和webforms中。在webforms中,页面由请求实例化。由于页面是视图,您无法控制执行顺序,因此视图必须在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);
}
}
正如您所看到的,后者的代码重复要少得多。当然,这是愚蠢的重复,或者你可以说你可以将普通功能移动到共享功能,但你明白了,这只是一个例子。。此时,您将在应用程序的多个部分实例化相同的视图
此外,视图了解演示者的优点是,您只需要在视图项目中引用演示者,这样您就可以在不同的UI应用程序中重复使用同一演示者。否则,您将需要引用演示者中的每个视图项目
但更重要的是看不同的模型如何适合您的情况。老实说,那么,您的意思是您的演示者将了解具体视图吗?不。演示者仅通过视图实现的接口引用视图。这将演示者与视图实现分离,并使单元测试演示者逻辑非常容易,因为您可以使用模拟视图进行测试。如果您在另一个演示者上的方法中根据需要实例化视图,那么该演示者肯定必须知道具体视图?@kevint-也有办法;要么让演示者要求自己的视图创建新的子视图,要么进行某种视图查找,因此返回的实现不是显式的。不可否认,答案并不太清楚……好吧,我明白你的意思。我想类似于中的IMessageBoxCreator的东西可能会起作用,只是它会创建带有演示者的屏幕,而不仅仅是简单的对话框。因此,您在表示层中实现了IDialogCreator(它返回IDialogView),而您的控制器/演示者仍然对细节一无所知。谢谢你的回复!