2012-03-18 26 views
18

Ho una domanda su come gestire la comunicazione tra i relatori quando si utilizza MVP. Supponiamo di avere due triadi MVP. Uno è un elenco di prodotti (Triad A) e l'altro contiene alcune informazioni generali sul prodotto attualmente selezionato (Triade B).MVP Comunicazione tra relatori?

Come comunicare a Presenter B che è necessario aggiornarlo perché il prodotto selezionato è stato modificato da A? Naturalmente posso pensare a modi per farlo, ma mi chiedevo se esiste una convenzione generale su come gestirlo.

Grazie in anticipo per qualsiasi idea!

risposta

12

Il pattern stesso non prescrive realmente come gestirlo.

La mia preferenza è un hub di messaggi/eventi in cui i presentatori possono registrare interessi in determinati eventi. Previene gli alberi di dipendenza complessi e mantiene i relatori testabili.

Ad esempio:

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 avrebbe mantenuto un elenco di iscritti per invocare per ogni tipo di evento.

È possibile mantenere la testabilità - è sufficiente chiamare il numero HandleProductChanged per vedere come PresenterB risponderebbe a una nuova selezione di prodotti.

L'unico svantaggio (come con qualsiasi modello) è introdurre un livello di riferimento indiretto. Se PresenterA ha invocato direttamente PresenterB, o PresenterB ha ascoltato un evento su PresenterA, è immediatamente ovvio cosa succederà.

In questo approccio, avresti il ​​passaggio in più per vedere EventType.ProductChanged, e quindi trovare quali Presentatori hanno registrato un interesse per quell'evento.

Nella mia esperienza personale, l'unico livello di riferimento indiretto merita la modularità.

+1

Questo è esattamente quello che stavo cercando, sembra molto meglio che passare i riferimenti del relatore in giro. Domani darò un'occhiata a me quando non sono stanco. Grazie. – user1277327

1

Personalmente sono d'accordo il modo in cui molte persone scelgono bus evento per risolvere questo tipo di problemi

E 'difficile per me immaginare un caso in cui due presentatori hanno bisogno di comunicare tra di loro, si può fornire un caso reale?

A mio parere, se due presentatori devono comunicare tra loro, è necessario unire questi due in un solo presentatore. Ricorda che anche la comunicazione dei modelli oggetto tra due casi d'uso è logica aziendale, quindi forse l'ambito del presentatore è più grande di quanto pensassi inizialmente.

Considera anche che se si utilizzano i collaboratori nel modo giusto, non è necessaria la comunicazione tra i relatori. I dati dovrebbero essere forniti dai collaboratori.

+0

Ciao, puoi far luce su come si dovrebbe comunicare dal modello al presentatore in modo che il relatore possa eseguire un'azione sulla vista. per esempio, ad esempio, la lettura del database viene eseguita nel modello, quindi come dovrebbe il modello dire al presentatore che ha letto i dati e passarli indietro al presentatore in modo che il relatore possa aggiornare la vista. – eRaisedToX

+0

"la lettura del database è fatta nel modello" ... naat XD ... preferirei creare un interactor. –