View&主持人出生

时间:2008-12-09 22:04:18

标签: winforms webforms mvp

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

我的问题是:视图和演示者应该在哪里创建?还有winforms和webforms的地方。

3 个答案:

答案 0 :(得分:3)

在webforms中,页面由请求实例化。由于页面是视图而您无法控制执行顺序,因此视图必须向演示者注册自己

答案 1 :(得分:2)

在Winforms中,我根据需要实例化视图(例如:在main方法中,或在另一个演示者的方法中,但真正有意义的地方)。然后,视图会创建并使用演示者的新实例注册自己。

这使得多个视图可以轻松使用相同的演示者逻辑,并使我的视图用户免受我的特定架构决策使用MVP。

答案 2 :(得分:1)

首先是好问题。其次,它可能无关紧要。我个人的偏好是几乎总是在视图中连接Presenter和View。

比较这种情况:

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。

此外,View了解Presenter的优点是您只需在View项目中引用Presenter,因此您可以在不同的UI应用程序中重用相同的Presenter。否则,您需要引用Presenter中的每个View项目..

但更重要的是要了解不同模型如何适合您的情况。说实话,there are more possibilities even. See this duplicate question.