2009-12-05 44 views
1

在工作中,我得到維護的產品有很多「移動部件」,我的主要障礙之一是它的架構如果十個不同的位置需要知道列表中的新項目被選中,直接代碼路徑必須進行編碼。例如在以下佈局中。是否有用於應用內通信的輕量級發佈/訂閱庫?

      Form1 
          | 
     +-------------------+---------------------+ 
     |     |      | 
    Control1   Control2    Control3 
     |     |      | 
     |    +-----------+   +----+----+ 
     |    |   |   |   | 
SelectionList  View1  View2  View3  View4 

(我工作,對實際應用有比這更多層的GUI組件... ...的Bleh)

如果再加上另一種觀點認爲任何控制,這取決於其產品選中,Form1需要路由郵件。更糟的是,如果我們添加各種可以在選擇列表或任何視圖上調用的命令,則需要修改視圖以正確調用操作。通常,這樣的動作(通過主菜單選項和可用太...)安置在Form1中

(這樣想的文件列表中SelectionList的...)

這似乎是脆弱的,很麻煩。

最近我一直在玩一個應用程序中的子系統(如命令)和訂閱者只需要知道定義的應用程序中的子系統的想法(或獲取價格是否正確)事件參數和事件名稱以便接收事件。

我的問題是:

  1. 是否有商業的,開源的,或公共域庫在.net 3.5已經做到這一點? (我使用C#)。這需要是一個INTRA-APPLICATION機制。我已經知道的程序間庫和機制,例如MSMQ和This Codeplex project.

  2. 如果你有經驗的開發或使用這樣的解決方案,什麼是前3名的陷阱,以避免?

回答

1

我會看一看棱鏡(http://www.codeplex.com/compositewpf),其中包括了EventAggregator服務,這確實非常正是你想要的。 EventAggregator並不僅限於WPF,而是複合UI的東西。

+0

@喬希。謝謝,我會檢查出來。我已經知道我想如何運作。希望這會做到這一點,並節省一些時間。至於第二個問題,你有使用EventAggregator的經驗嗎?如果是這樣,儘管有可能,你會建議什麼樣的事情避免使用它? – 2009-12-06 03:23:03

+0

那麼,EventAggregator本質上是非常基本的,所以我不能真正想到你不想做的事情,因爲它幾乎只做一件事(pub/sub事件管理)。我想我只是建議你不要試圖將它用於一切。例如,在適當的地方使用命令模式和標準事件。 – Josh 2009-12-06 05:20:13

+0

感謝您的反饋。工作一直很忙,所以沒有機會嘗試它。我可能會在下週嘗試一下。 – 2009-12-09 06:25:15

1

這可以作爲一個ligthweight消息傳遞框架嗎?

function MyConstructor() { 
    this.MessageQueues = {}; 

    this.PostMessage = function (Subject) { 
     var Queue = this.MessageQueues[Subject]; 
     if (Queue) return function() { 
             var i = Queue.length - 1; 
             do Queue[i](); 
             while (i--); 
            } 
     } 

    this.Listen = function (Subject, Listener) { 
     var Queue = this.MessageQueues[Subject] || []; 
     (this.MessageQueues[Subject] = Queue).push(Listener); 
    } 
} 

那麼你可以做:

var myInstance = new MyConstructor(); 
myInstance.Listen("some message", callback()); 
myInstance.Listen("some other message", anotherCallback()); 
myInstance.Listen("some message", yesAnotherCallback()); 

及更高版本:

myInstance.PostMessage("some message"); 

將調度隊列

+0

我不希望接收者知道發件人的實例。在你提供的代碼中,情況依然如此。在我接受答案的時候,微軟的頁面還詳細介紹了他們在WPF中的代理子系統。我用它作爲我自己的winform實現的鼓舞人心的材料。 (我不想將WPF的依賴引入到具有衆多異構技術的應用程序中 - ActiveX,COM,C++,WTL,ATL,Winforms)。 – 2010-07-05 00:43:39

+0

我無法看到接收者知道發件人的任何內容,更多的是相反:發件人是向只有「存在」的接收者發佈消息的發件人。接收者只是「注意」某些任意消息,以任意回調的形式推送到這些消息隊列中......這可以通過將所有消息隊列放置在一箇中心的「郵局」(一種衆所周知的技術)中進一步解耦。 – ata 2010-10-16 22:54:16