上一回簡單介紹了一下Agile Framework的事件自動連接功能,這次來詳細介紹一下事件功能的實現原理。
在Agile Framework中,只要為組件分別標記上EventPublisher和EventSubscriber就可以自動實現互相之間的串連,實現了事件的完全解耦。這個功能和Castle容器的EventWiringFacility的功能很像(在Composite UI Application Block中也有同樣的事件機制)。但是和它們不同的是,Castle和CAB都只支援同一個容器內的事件互相串連。而Agile Framework的容器是分布式的,用戶端組件和伺服器組件都可以被加入到容器中,因此,Agile Framework的事件傳遞機制也是分布式的。簡單的說,在伺服器的業務組件中定義的事件也可以被用戶端的組件接收到。
為了實現這個功能首先需要解決一個難題:因為Agile Framework可以同時支援Web Service和Remoting資料轉送介面(只需要在設定檔中簡單的修改一下配置,架構採用什麼類型的傳輸介面對開發人員來說是完全透明的),所以就必須讓事件傳遞機制同時支援這兩種介面。用Remoting還比較好解決,因為Remoting本身就支援遠端事件機制。但是Web Service就麻煩了,它只支援簡單請求/響應的無狀態訪問模型,無法主動讓伺服器發訊息給用戶端。
Agile Framework採用的Event Dispatch機制比較完美的解決了這個問題,以下是架構的事件模型圖:
在整個結構中,Event Dispather是所有事件的中轉站,它訂閱了系統中所有的事件,並且知道每一個事件接受者。
事件的傳遞機制簡單描述如下:
當Event Dispatcher接收到一個被觸發的事件後,他會檢查事件訂閱列表,逐一將事件分發到每個接收者,根據事件接收者所處的位置不同,這時會有如下幾種不同的情況:
- 假如事件接受者就在容器內部,Event Dispatcher會直接將事件發送到該接收者。
- 假如事件接收者是在用戶端(Smart Client)並且介面是Remoting,Event Dispatcher會調用Remoting的遠程介面將事件發送到用戶端。
- 假如事件接收者是在用戶端(Smart Client)並且介面是Web Service,Event Dispatcher會將事件發送給一個叫Event Holder的對象,這個對象負責接收所有發送給用戶端的事件,並且儲存下來。在用戶端架構會有一個叫Event Detector的對象定時通過Web Service進行輪詢來檢查EventHolder中的事件。假如有事件是被發送到該用戶端的,就會接受該事件數目據並轉寄給用戶端的事件接收方法。
- 如果事件接收者是Web頁面,在Agile Framework中也有一個功能類似Event Detector的Ajax對象也會對Event Holder進行輪詢。因此在Agile Framework中業務組件所定義的事件也能被Web頁面對象接收到。
以上就是Agile Framework事件分發機制的基本原理。Agile Framework是一個開源的基於.Net 2.0技術的中介軟體平台,目前正在開發中,更多資訊請訪問敏捷實驗室。