2013-03-15 19 views
10

Warum können wir ohne PayLoad veröffentlichen, um Ereignisse nicht.Veröffentlichen Sie ein Ereignis ohne PayLoad in Prism EventAggregator?

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

Jetzt brauche ich keine Payload, um hier übergeben zu werden. Aber die EventAggregator-Implementierung schreibt vor, dass ich eine leere Klasse dafür habe.

Veranstaltung:

public class SelectFolderEvent : CompositePresentationEvent<SelectFolderEventCriteria> 
    { 
    } 

PayLoad:

public class SelectFolderEventCriteria 
    { 
    } 

Warum hat Prism keine Möglichkeit gegeben nur das Ereignis zu verwenden und veröffentlichen es wie

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

Ist es durch Design und Ich verstehe es nicht? Bitte erläutern. Vielen Dank!

+0

meine Antwort geholfen hat? – Marc

Antwort

9

Gute Frage, ich sehe keinen Grund, nicht ein Ereignis ohne Nutzlast zu veröffentlichen. Es gibt Fälle, in denen die Tatsache, dass ein Ereignis ausgelöst wurde, alle Informationen sind, die Sie benötigen und behandeln möchten.

Es gibt zwei Möglichkeiten: Da es Open Source ist, können Sie die Prism Quelle nehmen und ein CompositePresentation Ereignis extrahieren, die keine Nutzlast nimmt.

Ich würde das nicht tun, sondern behandeln Prism als 3rd-Party-Bibliothek und lassen Sie es wie es ist. Es empfiehlt sich, eine Facade für eine 3rd-Party-Bibliothek zu schreiben, es in Ihrem Projekt zu passen, in diesem Fall für CompositePresentationEvent. Dies könnte in etwa so aussehen:

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); 
    } 
} 

Wenn etwas unklar ist, fragen Sie bitte.

+1

Großartige Lösung, ich denke, Sie müssen nur von EventBase erben, um es richtig zu funktionieren - wie hier empfohlen: https://compositewpf.codeplex.com/discussions/69113 – openshac

+0

True, danke! Wenn Sie es mit Abhängigkeitsinjektion verwenden, benötigen Sie möglicherweise nicht die Vererbung, aber das war nicht die Frage hier ... – Marc

2

einfach die Situation zu aktualisieren, da diese Frage gestellt wurde/beantwortet, wie von Prism 6.2 werden leere Nutzlasten jetzt in Prism PubSubEvents unterstützt.

Wenn Sie eine ältere Version verwenden, zeigt dieses Blog wie eine „leere“ Klasse erstellen, die die Absicht der Nutzlast zeigt deutlich: https://blog.davidpadbury.com/2010/01/01/empty-type-parameters/