2012-12-12 40 views
3

我試圖最近實現我自己的簡單事件聚合器。我從MSDN上的事件聚合器文章中獲得了很多靈感。有一件事我注意到關於MSDN上的事件聚合器事件實際上是自己的類。這根本不是一件壞事。不過,我總覺得總是爲每一個小事件創建一個新的空課程很尷尬。在事件聚合器中混合具有事件類的枚舉

我覺得很尷尬的原因是因爲需要爲每一個粒度事件創建一個類。例如,鼠標點擊事件會有double_click,single_click,left_click,right_click等,並且所有這些將會有一個類。一段時間後它會變得混亂。

所以在我自己的實現中,我認爲我可以用ClickEvent是一個類的方式來創建它,但是與Click事件相關的所有粒度事件將是ClickEvent的「類型」。在這種情況下,「類型」是enum。用法會是這個樣子:

//Publisher 
eventAggregator.GetEvent<ClickEvent>.Publish(ClickEventType.Double_Click, eventArgs); 

//Subscriber 
eventAggregator.GetEvent<ClickEvent>.Subscribe(ClickEventType.Double_Click, handlerMethod); 

不過,我不知道這是否實施有違於使用強類型事件的整個目的是什麼?現在,ClickEvent似乎只是不同事件枚舉類型的容器。

回答

3

是的它(看起來像一個容器) - 無論點擊類型如何,您的處理程序都會觸發,處理程序中將需要一些代碼來確定點擊類型,這會使事情變得更加混亂。

如果你的問題是文件/類的主要組織和保持整潔的代碼,爲什麼不主的點擊類中創建點擊事件嵌套類

例如

public static class ClickEvents // Prevent instantiation 
{ 
    public class SingleLeft { } 
    public class SingleRight { } 
    public class DoubleLeft { } 
    public class DoubleRight { } 
    // Are there any more click events possible?! 
} 

eventAggregator.GetEvent<ClickEvents.SingleLeft>.Publish(); 

除此之外,它是決定事件簽名,因此,多種類型的需要,以滿足這個特定的實現

至少上述讓你的處理程序代碼清潔型的獨特

void HandleLeftClick() 
{ 
} 

VS

void HandleClick(ClickArgs e) 
{ 
    if(e.ClickType == ClickType.Left) 
    { 
    } 
} 

編輯:

還請記住,你可以訂閱多個事件相同的處理程序,如果你要處理超過一個點擊類型:

eventAggregator.GetEvent<ClickEvents.SingleLeft>.Subscribe(HandlerMethod); 
eventAggregator.GetEvent<ClickEvents.SingleRight>.Subscribe(HandlerMethod); 

(這將在罕見的情況下工作的用戶並不關心哪鼠標按鈕被點擊)

0

我想你錯過了一種可能性。你看,你不必爲每個通知創建一個新類。相反,你可以自由地重用類,但是會在內部帶來一些額外的任意複雜狀態。

public class MouseClickNotification { 

    public bool IsDoubleClick; 
    public MouseButton ClickedButton; 

    // any additional stuff 

這樣,您就可以精確定義您的通知模型的粒度。

+0

這個工作假設你想要在處理程序中的一些代碼來確定什麼類型的點擊被引發。如果您準備繼續在每個處理程序中編寫代碼 - 這是兩個惡意中較小的一個對您而言,我認爲這很有效。我想 – Charleh

+0

總是這樣。我的意思不是建議鼠標事件背後的任何具體模型,而是要表明像「讓我們爲所有事物建立新班級」這樣的想法無處可逃。請注意他的單點擊,雙擊,左鍵單擊和右鍵單擊課程的想法。他應該如何模擬左側雙擊和右側雙擊? –

+0

只需爲每個特定活動創建一個班級 - 例如SingleLeft,DoubleLeft。我並不是說你的實現是錯誤的,這似乎是自然而然的事情,但顯然,你最終會在每個單擊處理程序中添加一些額外的代碼來確定它是哪種類型的點擊,而創建一個類型爲每個事件消息都可讓您自由地知道事件類型是否入站,而無需在處理程序中執行額外的處理。無論哪個人讓你的生活更輕鬆,我只是喜歡每個消息類型的實現。 – Charleh