2017-04-06 97 views
0

我發現articles約和solutions這個問題有關棱鏡,但我沒有找到任何有關Caliburn微。我檢查了全部這裏標記爲Caliburn.MicroEventAggregator的問題,但沒有找到任何Caliburn關於這個看似基本問題的具體內容。如何使用Caliburn Micro的EventAggregator發送空事件(無有效載荷)?

場景:我想發佈事件到EventAggregator沒有任何信息,除了表示發生了什麼事。

問題:首先,在Caliburn Micro中,EventAggregatorPublish()方法需要發送一個類型的實例。其次,訂閱和處理事件需要實現IHandle<T>接口,其中T是我們想要接收的實例類型。看起來這是完全圍繞發佈和處理實際數據而設計的。

目標:爲了能夠發佈簡單的事件,而無需創建和實例化多個空/空類,而不必,我需要用條件來進一步篩選Handle()不必要的事件。


我的解決方案至今

這是我想提高/替換一下。 (顯然,這個解決方案是有問題的,因爲它在具體類上創建了更緊密的耦合,但在我的用例中,這不是一個大問題,因爲它是一個針對特定事件的單個發佈組件的小型項目,而EventAggregator服務於其他實際目標。)

我做了一個通用Signal<T>類實現Singleton模式,通過Instance財產提供其自身的靜態實例:

public class Signal<T> 
{ 
    public static readonly Signal<T> Instance = new Signal<T>(); 

    private Signal() { } 
} 

所以我可以發佈按以下方式事件(SignalSourceClass就是一個例子):

_eventAggregator.PublishOnUIThread(Signal<SignalSourceClass>.Instance); 

並通過以下方式宣佈的IHandle<T>執行處理事件:

IHandle<Signal<SignalSourceClass>> 

這樣我可以送,並通過創建僅此單一Signal類收到「空」事件。 (當然這是一個有限的解決方案,因爲組件只能以這種方式發送一個事件。)

我懷疑這個解決方案是原始的(好吧,讓我們把它稱爲事實),並且有更好的東西我俯視。

+0

你希望有與事件相關聯的類型?我想你也可以發送「」。 _eventAggregator.PublishOnUIThread( 「」); –

+0

是的,我想以某種方式識別事件,並以不需要在接收類中進行額外「if」檢查的方式實現IHandle 和Handle()(例如,它們沒有接收到事件對他們沒用)。如果我可以使用事件的發件人,那在這個小型項目中是完美的。也許我應該嘗試裝飾EventAggregator類與額外的功能? –

回答

2

只需創建一個枚舉所有可能的信號,你想:

public enum ProjectSignals 
{ 
    Connected, 
    Disconnected, 
    Openned 
} 

然後就

_eventAggregator.PublishOnUIThread(ProjectSignals.Connected); 

class SomeClass : IHandle<ProjectSignals> 
{ 
    public void Handle(ProjectSignals signal) 
    { 
     switch (signal) 
     { 
      case Connected: 
       break; 
     } 
    } 
} 
+0

謝謝!你認爲我可以避免這種轉變嗎? (並且只接收例如ProjectSignals.Connected。)我會確定您的答案,但是我今天沒有投票。 :) –

+0

不直接。發佈基於對象的類型。你可以創建一個單一的枚舉你想要捕捉的東西。一個用於連接,一個用於斷開連接等等。 –

+0

是的,這絕對是可行的,但類似於空的類,空的枚舉看起來有點奇怪;我希望有一些「感覺不錯」的東西。不確定,但如果在這種情況下這是正確的態度。 :) –

相關問題