5

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

那么我的问题是:应该在哪里创建视图和演示者?也在winforms和webforms中。

4

3 回答 3

3

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

于 2008-12-09T22:15:08.730 回答
2

在 Winforms 中,我根据需要实例化视图(例如:在main方法中,或在另一个演示者的方法中,但在任何地方都有意义)。然后视图创建​​并注册一个新的演示者实例。

这使得让多个视图使用相同的演示者逻辑变得容易,并且使我的视图的用户免受我使用 MVP 的特定架构决策的影响。

于 2008-12-09T22:28:05.677 回答
1

首先是好问题。其次,它可能并不重要。我个人的偏好是几乎总是在视图中连接演示者和视图。

比较这个场景:

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 项目。

但更重要的是看看不同的模型如何适合你的情况。老实说,甚至还有更多的可能性。请参阅这个重复的问题。

于 2013-01-17T23:15:05.757 回答