2012-03-18 6 views
18

J'ai une question sur la façon de gérer la communication entre les présentateurs lors de l'utilisation de MVP. Dis que j'ai deux triades MVP. L'un est une liste de produits (Triad A) et l'autre est une information générale sur le produit actuellement sélectionné (Triad B). Comment puis-je dire au présentateur B qu'il doit mettre à jour parce que le produit sélectionné a été modifié par A? Je peux bien sûr penser à des moyens de le faire, mais je me demandais s'il y avait une convention générale sur la façon de gérer cela.MVP Communication entre les présentateurs?

Merci d'avance pour vos idées!

Répondre

12

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.

+1

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

1

Je ne partage pas personnellement la façon dont beaucoup de gens choisissent bus d'événements pour résoudre ce genre de problèmes

Il est difficile pour moi d'imaginer un cas où deux présentateurs doivent communiquer entre eux, pouvez-vous fournir un cas réel? À mon avis, si deux présentateurs ont besoin de communiquer entre eux, vous devriez fusionner ces deux en un seul présentateur. Rappelez-vous que la communication des objets de modèles entre deux cas d'utilisation est une logique métier, alors peut-être que la portée du présentateur est plus grande que ce que vous pensiez initialement. En outre, si vous utilisez correctement les collaborateurs, vous n'avez pas besoin de communication entre les présentateurs. Les données doivent être fournies par des collaborateurs.

+0

Salut, Pouvez-vous jeter un peu de lumière sur la façon dont on devrait communiquer du modèle au présentateur de sorte que le présentateur pourrait effectuer une action sur la vue. par exemple, disons, la lecture de la base de données est faite dans le modèle alors, comment le modèle devrait dire au présentateur qu'il a lu les données et renvoyer les données au présentateur afin que le présentateur puisse mettre à jour la vue. – eRaisedToX

+0

"la base de données est lue dans le modèle" ... naat XD ... je préférerais créer un interacteur. –