2008-12-09 7 views
5

Ich verstehe das MVP-Muster jetzt vollkommen, aber ich habe immer noch Schwierigkeiten zu sehen, wo Views und Presenter instanziiert werden. Ich habe einige Beispiele gesehen, bei denen der Moderator in der Ansicht neu dargestellt wird, aber das ist richtig. Nach dem Lesen eines Blogposts von Jeremy Miller über die Kommunikation zwischen View und Presenter hatte er eine Funktion auf dem Presenter, um den Moderator an die Ansicht anzuhängen.Wo soll View & Presenter geboren werden?

Meine Frage ist dann das: Wo sollten Ansichten und Moderatoren erstellt werden? Auch wo in Winforms und Webforms.

Antwort

3

In Webformularen wird die Seite durch die Anfrage instanziiert. Da die Seite die Ansicht ist und Sie die Ausführungsreihenfolge nicht steuern können, muss sich die Ansicht selbst beim Referenten registrieren.

+1

Was ist mit Winforms? – adriaanp

2

In Winforms instanziiere ich die Ansicht nach Bedarf (z. B .: in der Methode main oder in eine Methode auf einem anderen Präsentator, aber wo auch immer sinnvoll Sinn macht). Die Ansicht erstellt und registriert sich dann bei einer neuen Instanz eines Präsentators.

Dies macht mehrere Ansichten verwenden die gleiche Moderator Logik einfach, und schirmt Benutzer meiner Sicht von meiner bestimmten architektonischen Entscheidung, MVP zu verwenden.

+0

Sie meinen also, Ihr Moderator wird von der konkreten Sichtweise wissen? – Samnang

+1

Nein. Der Moderator hat nur über eine Schnittstelle, die die Ansicht implementiert, einen Verweis auf die Ansicht. Dies entkoppelt den Präsentator von der Ansichtsimplementierung und macht die Moderatorlogik von Einheitentests sehr einfach, da Sie eine Testansicht zum Testen verwenden können. –

+0

Wenn Sie die Ansicht nach Bedarf in einer Methode für einen anderen Präsentator instanziieren, muss dieser Präsentator sicher die konkrete Ansicht kennen? –

1

Erstens gute Frage. Zweitens, es spielt vielleicht keine große Rolle. Meine persönliche Präferenz besteht darin, Presenter und View fast immer miteinander zu verbinden.

Vergleichen dieses Szenario:

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

dazu:

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

Wie Sie, dass letztere hat viel weniger Code-Duplizierung sehen. Natürlich ist das dumme Vervielfältigung, oder Sie könnten sagen, dass Sie allgemeine Funktionalität in eine gemeinsame Funktion verschieben können, aber Sie bekommen den Punkt, das ist nur ein Beispiel .. Das ist, wenn Sie die gleiche Ansicht in mehreren Teilen Ihrer Anwendung instanziiert haben. Der Vorteil des Views, den Presenter zu kennen, besteht darin, dass Sie Presenter nur in Ihrem View-Projekt referenzieren müssen, damit Sie denselben Presenter in verschiedenen UI-Anwendungen wiederverwenden können. Andernfalls müssen Sie jedes View-Projekt im Presenter referenzieren.

Aber was noch wichtiger ist, ist zu sehen, wie die verschiedenen Modelle zu Ihrem Fall passen. Um ehrlich zu sein, there are more possibilities even. See this duplicate question.