Winforms 应在何处查看&;演讲者出生

Winforms 应在何处查看&;演讲者出生,winforms,webforms,mvp,Winforms,Webforms,Mvp,我现在完全理解MVP模式,但我仍然很难看到视图和演示者的实例化位置。我见过一些例子,演示者在视图中是新出现的,但这是正确的吗。在阅读了Jeremy Miller关于视图和演示者之间通信的博客文章后,他在演示者上有一个功能,可以将演示者附加到视图 我的问题是:应该在哪里创建视图和演示者?另外,在winforms和webforms中。在webforms中,页面由请求实例化。由于页面是视图,您无法控制执行顺序,因此视图必须在Winforms中向演示者注册自己,我根据需要实例化视图(例如:在main方法

我现在完全理解MVP模式,但我仍然很难看到视图和演示者的实例化位置。我见过一些例子,演示者在视图中是新出现的,但这是正确的吗。在阅读了Jeremy Miller关于视图和演示者之间通信的博客文章后,他在演示者上有一个功能,可以将演示者附加到视图


我的问题是:应该在哪里创建视图和演示者?另外,在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),而您的控制器/演示者仍然对细节一无所知。谢谢你的回复!