Le modèle lui-même ne prescrit pas vraiment comment gérer cela.
Ma propre préférence est un concentrateur de messages/événements où les présentateurs peuvent enregistrer leur intérêt pour certains événements. Il empêche les arbres de dépendances complexes et permet de tester les présentateurs.
Par exemple:
class PresenterA
{
void HandleProductSelectionChanged(int productId)
{
EventHub.Publish(EventType.ProductChanged, productId);
}
}
class PresenterB
{
void PresenterB
{
EventHub.Register(EventType.ProductChanged, HandleProductChanged);
}
public void HandleProductChanged(object state)
{
var productId = (int)state;
var productDetails = LoadProductDetails(productId);
view.DisplayProductDetails(productDetails);
}
}
EventHub garderait une liste d'abonnés à invoquer pour chaque type d'événement.
Vous maintenez votre testabilité - appelez simplement HandleProductChanged
pour voir comment PresenterB répondrait à une nouvelle sélection de produit. Le seul inconvénient (comme pour n'importe quel motif) est que vous introduisez un niveau d'indirection. Si PresenterA a directement appelé PresenterB, ou PresenterB a écouté un événement sur PresenterA, il est immédiatement évident de savoir ce qui va se passer.
Dans cette approche, vous auriez l'étape supplémentaire en voyant EventType.ProductChanged, puis en recherchant quels présentateurs étaient intéressés par cet événement. Dans ma propre expérience, ce seul niveau d'indirection vaut bien la modularité que vous obtenez.
C'est exactement ce que je cherchais, c'est beaucoup mieux que de passer des références de présentateurs. J'y jetterai un coup d'oeil demain quand je ne serai pas aussi fatigué. Merci. – user1277327