2010-11-22 3 views
1

Angenommen, Sie haben mehrere MVP-Triaden in Ihrer Anwendung (WinForms .NET 2.0-App) und jede Dreiergruppe kümmert sich um einen Zuständigkeitsbereich. Was ist Ihre bevorzugte Art, die Kommunikation zwischen den MVP-Triaden zu koordinieren?Koordinierende MVP-Triaden

Option 1 Ein Koordinatorobjekt, das jedes Modell "hat" und nach der Koordination sucht, indem es die erforderlichen Ereignisse in jedem abonniert und dann entscheidet, welche Modellmethoden in welchen Szenarien aufgerufen werden sollen.

Sorge, dass dies eine "Gott" -Klasse sein kann.

Option 2 Ein Moderator "hat" einen anderen Moderator. Wenn etwas Interessantes im Modell passiert, verwendet der Präsentator den anderen Moderator, um die Kommunikation zu verschieben.

Sorge, dass die Moderatoren keine öffentliche Schnittstelle haben sollten (Presenter-first Ansatz) und das bricht.

Ich frage mich nur, was andere Leute getan haben, um dieses Problem in einer skalierbaren OO-Mode zu lösen. Was passiert, wenn ich einen weiteren MVP-Dreiklang hinzufüge? Wie schwer wird es sein, das in meinen Koordinator zu integrieren? Es muss einige gute Beispiele für die Verwaltung mehrerer MVP-Triaden in einer WinForms-App geben.

Antwort

3

Nicht zu vage ... aber es kommt darauf an. Die beiden Ansätze, die ich in der Vergangenheit verwendet haben:

  1. Verwenden Sie ein Event Aggregator Muster und haben die einzelnen Moderatoren Ereignisse abfeuern, die anderen Moderatoren verarbeiten kann. z.B. PresenterA macht: events.Raise<MyEvent>() und PresenterB implementiert: IHandler<MyEvent> und reagiert entsprechend in seiner public void Handle (MyEvent @event) Methode.
  2. Verwenden Sie ein freigegebenes Modell, das in die Moderatoren eingefügt wird, die koordiniert werden müssen. Wenn beispielsweise ein Moderator die Auswahl eines bestimmten Foo übernimmt und der andere Moderator ein Detailfenster mit Foo-Details aktualisieren muss, kann ich ein IFooSelection-Zustandsmodell verwenden und dieses in beide Präsentatoren einspeisen, die das Konzept der aktuellen Auswahl koordinieren müssen ".

Die Schnittstelle:

public interface IFooSelection { 
    public event EventHandler Changed; 
    Foo Selected { get; set; } 
}