Quali sono gli avvertimenti del sistema di eventi costruiti su Messenger piuttosto che su eventi .NET classici?

2

MVVM Light e PRISM offrono messenger per implementare il sistema degli eventi.

l'interfaccia approssimativa è simile alla seguente:

interface Messanger
{
    void Subscribe<TMessageParam>(Action<TMessageParam> action);
    void Unsubscribe<TMessageParam>(Action<TMessageParam> action);
    void Unsubscribe<TMessageParam>(objec actionOwner);
    void Notify<TMessageParam>(TMessageParam param);
}

Ora questo modello sembra vantaggioso rispetto agli eventi classici .net. Funziona bene con l'iniezione di dipendenza. Le azioni vengono memorizzate come riferimenti deboli, pertanto le perdite di memoria vengono avviate e l'annullamento dell'iscrizione non è obbligatorio. L'unico fastidio è la necessità di dichiarare il nuovo TMessageParam per ogni messaggio specifico. Ma tutto ha un costo. E quello che mi preoccupa davvero è che non vedo difetti di questo approccio.

Qual è stata l'esperienza di alcuni problemi con questo modello di progettazione?

Aggiorna
L'abbiamo provato e la cosa più sgradevole con i messaggi è la loro implicita dal punto di vista dell'interfaccia. I messaggi contrari agli eventi non vengono esplicitamente esposti nell'interfaccia, pertanto è necessario fornire ulteriore documentazione.
Come diceva Laurent in basso, l'accoppiamento molto lento ha un costo di indeterminatezza.

    
posta Pavel Voronin 14.11.2012 - 07:35
fonte

2 risposte

2

Uno degli attributi dell'evento .NET nativo è che è immutabile, il che rende il loro accesso locklessly thread-safe. Immagino che non si possa dire lo stesso di questa implementazione a cui ti riferisci, anche se potrebbe gestire le serrature sotto le coperte per te, almeno non devi. In alternativa potrebbe avere una propria forma di accesso immutabile (l'interfaccia è implementata su un tipo di valore?) Ma fare qualcosa di tale natura è piuttosto complicato in C #, motivo per cui gli eventi hanno sempre avuto supporto a livello di linguaggio.

Oltre a questo, potrebbero esserci differenze di prestazioni tra i due, ma non posso dire per certo in un modo o nell'altro, e inoltre c'è il fatto della sintassi che non è disponibile nel tuo approccio citato.

    
risposta data 14.11.2012 - 21:50
fonte
1

Il principale svantaggio dei sistemi basati su messaggistica è che è meno facile capire cosa sta succedendo. Può essere più difficile eseguire il debug di ciò che accade rispetto a un sistema basato su eventi, proprio perché il sistema di messaggistica è più strettamente accoppiato. È lo stesso tipo di problema che viene fornito con sistemi avanzati come Rx (estensioni Reactive).

    
risposta data 17.11.2012 - 09:17
fonte

Leggi altre domande sui tag