2013-03-15 24 views
10

Perché non possiamo pubblicare eventi senza PayLoad.Pubblica un evento senza PayLoad in Prism EventAggregator?

_eventAggregator.GetEvent<SelectFolderEvent>().Publish(new SelectFolderEventCriteria() { }); 

Ora, non ho bisogno di alcun carico da trasferire qui. Ma l'implementazione EventAggregator mi impone di avere una classe vuota per farlo.

evento:

public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria> 
    { 
    } 

Carico utile:

public class SelectFolderEventCriteria 
    { 
    } 

Perché ha Prism non dato un modo per utilizzare solo l'evento e pubblicarlo come

_eventAggregator.GetEvent<SelectFolderEvent>().Publish(); 

E 'in base alla progettazione e Non lo capisco? Per favore, spiega. Grazie!

+0

Forse la mia risposta di aiuto? – Marc

risposta

9

Buona domanda, non vedo un motivo per non pubblicare un evento senza un payload. Ci sono casi in cui il fatto che un evento sia stato sollevato è tutte le informazioni che ti servono e che vuoi gestire.

Ci sono due opzioni: dato che è open source, puoi prendere la sorgente Prism ed estrarre un evento CompositePresentation che non prende un payload.

Non lo farei, ma gestisco Prism come libreria di terze parti e lo lascio com'è. È buona norma scrivere uno Facade per una libreria di terze parti per adattarlo al progetto, in questo caso per CompositePresentationEvent. Questo potrebbe essere qualcosa del genere:

public class EmptyPresentationEvent : EventBase 
{ 
    /// <summary> 
    /// Event which facade is for 
    /// </summary> 
    private readonly CompositePresentationEvent<object> _innerEvent; 

    /// <summary> 
    /// Dictionary which maps parameterless actions to wrapped 
    /// actions which take the ignored parameter 
    /// </summary> 
    private readonly Dictionary<Action, Action<object>> _subscriberActions; 

    public EmptyPresentationEvent() 
    { 
     _innerEvent = new CompositePresentationEvent<object>(); 
     _subscriberActions = new Dictionary<Action, Action<object>>(); 
    } 

    public void Publish() 
    { 
     _innerEvent.Publish(null); 
    } 

    public void Subscribe(Action action) 
    { 
     Action<object> wrappedAction = o => action(); 
     _subscriberActions.Add(action, wrappedAction); 
     _innerEvent.Subscribe(wrappedAction); 
    } 

    public void Unsubscribe(Action action) 
    { 
     if (!_subscriberActions.ContainsKey(action)) return; 
     var wrappedActionToUnsubscribe = _subscriberActions[action]; 
     _innerEvent.Unsubscribe(wrappedActionToUnsubscribe); 
     _subscriberActions.Remove(action); 
    } 
} 

Se qualcosa non è chiaro, si prega di chiedere.

+1

Ottima soluzione, penso che sia necessario ereditare da EventBase per farlo funzionare in modo propizio, come consigliato qui: https://compositewpf.codeplex.com/discussions/69113 – openshac

+0

Vero, grazie! Se lo usi con l'iniezione di dipendenza potresti non aver bisogno dell'ereditarietà, ma quella non era la domanda qui ... – Marc

2

Solo per aggiornare la situazione da quando è stata posta la domanda/risposta, a partire da Prism 6.2, i carichi utili vuoti sono ora supportati in Prism PubSubEvents.

Se si utilizza una versione precedente, questo blog mostra come creare una classe di "vuoto" che indica chiaramente l'intento del carico utile: https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/