2008-12-09 67 views
5

我完全理解MVP模式,但我仍然很难看到视图和演示者在哪里实例化。我已经看到一些例子,主持人在视图中被提出,但是这是正确的。在阅读Jeremy Miller关于View和Presenter之间的沟通的博客文章后,他在Presenter上有一个功能,让演示者附加到视图上。View&Presenter应该在哪里出生

我的问题是这样的:应该在哪里创建视图和主持人?也在winforms和webforms的地方。

回答

3

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

+1

winforms怎么样? – adriaanp 2008-12-09 22:17:14

2

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

这使得有几个视图使用相同的演示者逻辑容易,并保护我的观点的用户从我特定的架构决定使用MVP。

+0

所以,你的意思是你的主持人会知道具体的观点? – Samnang 2009-02-20 10:56:57

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.