2009-05-13 12 views
7

Wir versuchen, das Model-View-Presenter-Muster auf (fast) allen neuen Entwicklungsarbeiten zu verwenden, die wir durchführen.MVP-Muster, wie viele Ansichten zu einem Moderator?

Ich bin fest davon überzeugt, ein Framework zu haben, um Menschen zu helfen, eine Design-Anforderung zu erfüllen, wir haben ein paar interne Frameworks für verschiedene Komponenten (Protokollierung, E-Mail-Versand, etc.), also versuche ich zu bekommen eine Art von MVP-Framework entwickelt.

Ich habe es geschafft, etwas zusammenzubringen, das einfach zu verwenden ist für Leute, die nicht vertraut sind mit MVP und das ist nicht zu weit entfernt von wie wir derzeit arbeiten. Das Problem ist, dass es eine Beziehung von 1 Sicht zu 1 Moderator macht.

Hier ist eine grobe Skizze des Rahmens:

public abstract class Presenter<TView> where TView : IView { 
    public virtual T View { get; set; } 

    public virtual void Setup(TView view) { 
    this.View = view; 
    } 
} 

public interface IView { } 

Die grundlegende Art und Weise, dass es funktioniert, ist, dass all Ansicht erstellt erbt von der IView Schnittstelle und Presenter Klasse zu einem übergeben, die von der erbt Presenter abstrakte Klasse.

Wie Sie sehen können, verwende ich. NET-Generics, so dass der Entwickler eine starke Typisierung der Ansicht haben wird, wenn sie am Präsentator arbeiten (und schließlich eine Klasse vom Presenter erbt).

So kann ich eine grundlegende Login-Komponente wie folgt aufgebaut:

public class Login : Presenter<ILogin> { 
    public override Setup(ILogin view){ 
    base.Setup(view); 
    this.View.Login += new EventHandler(login); 
    } 
    void login(object sender, EventArgs e) { ... } 
} 

public interface ILogin : IView { 
    string Username { get; set; } 
    string Password { get; set; } 
    event EventHandler Login; 
} 

Also wie gesagt ich ganz davon, gibt es Compiler erzwungen Typisierung, stark typisierte Ansichten und ein MVP- wie Muster.

Einige Leute sind jedoch nicht ganz so glücklich mit der Implementierung, weil es eine 1 zu 1 Beziehung zwischen Moderatoren und Ansichten hat, und streng genommen ist das nicht, wie MVP gemeint ist.

Ich frage, wie gültig dieses Argument wirklich ist, auf den verschiedenen Projekten, die ich dieses Framework mit (von mittleren bis zu großen Projekten) verfolgt habe, habe ich kein gutes Beispiel gefunden, wo ich dachte "Ich brauche mehrere Ansichten für diesen Moderator ". Wenn ich Funktionen sehe, die über mehrere Ansichten hinweg geteilt werden können, frage ich mich, ob sie sogar an einen bestimmten Moderator gebunden sein sollten oder ob sie in einer neutraleren Klasse sein sollten.

Ist das Framework, das ich versuche zu weit von MVP zu erreichen MVP genannt werden? Ist das primäre Ziel von MVP die Notwendigkeit, mehrere Ansichten zu einem Moderator zu haben? Ist es überhaupt möglich, ein echtes .NET MVP-Framework mit n-view-Unterstützung zu haben?

Antwort

6

Ich sehe kein Problem mit Ihrem Ansatz. Sie müssen nicht unbedingt eine Eins-zu-viele-Beziehung zwischen einem Moderator und Ansichten haben - normalerweise haben Sie nur eine Ansicht pro Moderator. Die Idee hinter MVP ist Entkopplung Moderatoren von Ansichten, so dass Sie die Ansicht einfacher wechseln können, wenn Sie benötigen (zum Beispiel sowohl Web-Anwendung und eine Desktop-Anwendung zu unterstützen), aber das bedeutet nicht, dass Sie es machen müssen dynamisch.

Ein Vorschlag: Normalerweise liefere ich die IView als Konstruktor-Parameter an die Presenter. Die konkrete Implementierung von IView erstellt dann den Präsentator (entweder durch fest codierte new Presenter (this) oder mit einem IoC-Container, um es zu bekommen.

+0

Umsetzung kann ich Verdienste sehen die Ansicht als Ctor param nebenbei aber die meisten Anwendungen sind auf Web-Anwendungen, und ich habe eine andere Klasse bekommen, die UserControl mit dem Moderator umhüllt (so dass Sie auf der Ebene der Benutzeroberfläche erben können) –

+0

Könnten Sie bitte http://StackOverflow.com/questions/8851933/event-bubbling-and-mvp-asp-net beantworten? – Lijo