2008-12-09 4 views
5

Je comprends parfaitement le modèle MVP maintenant, mais j'ai toujours du mal à voir où les vues et les présentateurs sont instanciés. J'ai vu quelques exemples où le présentateur est nouveau dans la vue, mais est-ce correct. Après avoir lu un article de Jeremy Miller sur la communication entre View et Presenter, il avait une fonction sur le présentateur pour attacher le présentateur à la vue.Où naîtrait View & Presenter?

Ma question est la suivante: où les vues et les présentateurs devraient-ils être créés? Aussi où dans Winforms et webforms.

Répondre

3

Dans les formulaires Web, la page est instanciée par la demande. Depuis la page est la vue et vous ne pouvez pas contrôler l'ordre d'exécution, il est le point de vue qui doit se faire enregistrer avec le présentateur

+1

qu'en est-il des winforms? – adriaanp

2

En Winforms, j'instancier la vue selon les besoins (par exemple: dans la méthode main, ou une méthode sur un autre présentateur, mais où cela a vraiment du sens). La vue crée ensuite et s'enregistre avec une nouvelle instance d'un présentateur. Cela permet d'avoir plusieurs vues en utilisant la même logique de présentation, et protège les utilisateurs de ma vue de ma décision architecturale particulière d'utiliser MVP.

+0

Donc, vous voulez dire que votre présentateur connaîtra la vue concrète? – Samnang

+1

Non. Le présentateur fait référence à la vue uniquement via une interface implémentée par la vue. Cela dissocie le présentateur de l'implémentation de la vue et rend la logique de présentation de test unitaire très facile, car vous pouvez utiliser une vue fictive pour le test. –

+0

Si vous instanciez la vue comme requis dans une méthode sur un autre présentateur, alors ce présentateur doit sûrement connaître la vue concrète? –

1

Tout d'abord, bonne question. Deuxièmement, cela n'a peut-être pas beaucoup d'importance. Ma préférence personnelle est de presque toujours connecter Presenter et View dans la vue.

Comparer ce scénario:

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(); 
    } 
} 

à ceci:

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); 
    } 
} 

Comme vous pouvez voir que ce dernier a beaucoup moindre duplication de code. Bien sûr, c'est une duplication bête ou vous pourriez dire que vous pouvez déplacer des fonctionnalités communes à une fonction partagée, mais vous obtenez le point, c'est juste un exemple .. C'est quand vous aurez la même vue à instancier dans plusieurs parties de votre application.

En outre, l'avantage de View en connaissant le présentateur est qu'il suffit de référencer Presenter dans votre projet View pour pouvoir réutiliser le même Presenter dans différentes applications d'interface utilisateur. Sinon, vous devrez référencer chaque projet View dans le Presenter.

Mais le plus important est de voir comment les différents modèles s'adaptent à votre boîtier. Pour être honnête, there are more possibilities even. See this duplicate question.