2015-05-29 45 views
0

我正在使用棱鏡事件聚合器來觸發和關聯事件(發佈和訂閱)。該服務僅在有請求時才被實例化。從客戶端(通過通道)或從另一個服務(作爲類對象)。棱鏡事件聚合器和WCF服務和Unity

問題:

  • 如果事件沒有簽約(註冊和實例化),那麼即使它沒有 發生即沒有處理程序將被稱爲出版。

場景: 如果我使用可以說,作爲我們的用戶,也出版商和服務subsriber實例尚未創建和事件被觸發,可以做些什麼來WCF服務處理這一點,因爲此時用戶實例尚未創建。 (雖然註冊已完成)。

注意:我正在訂閱服務的ctor中的事件。

因此,簡而言之,我期望在發佈(事件觸發器調用)之前確保所有訂閱者都是instanstiated的。

可能的解決方案:我在看Unity應用程序塊來解決這種依賴性,但想要發現,如果這是正確的方向。爲了這個目的,我想在的global.asax.cs應用程序啓動方法做這樣的事情的:

IUnityContainer container = new UnityContainer(); 
container.RegisterType<ISubscribeEvent ,EventSubsriber>(); 

,然後我可以

EventPublisher = container.Resolve<EventPublisher>(); 

其中EventPublisher類的構造函數是

public EventPublisher(ISubscribeEvent obj) 
     { 

     } 

其中ISubscribeEvent將成爲每個用戶將實現的接口。所以無論何時發生事件,實現ISubscribeEvent接口的類都將被實例化。

這種方法有意義嗎?有沒有其他的選擇?

編輯:
事件將發生在服務器和用戶也將是服務器即服務呼叫服務將無法通過該通道,但作爲普通類調用回事服務。

更新: 我還看了IInstanceProvider here,因爲它可以提供一個接口,它可以用於控制使用Unity.WCF WCF服務實例的實例化。

回答

3

這是行不通的。

事件聚合器假定長時間存在的對象,首先訂閱事件,然後活到足以獲取通知的對象。

WCF服務實例是短暫存在的對象。一旦請求開始,一個實例就會被激活,一旦請求完成就會被刪除。

您發佈商和訂閱者都處於相同時刻的概率很低,因爲您已經注意到訂閱者尚未創建。

我相信你的問題源於你濫用事件聚合器的事實。 wcf服務可以發佈事件,但是在事件聚合器中註冊的用戶是wcf服務沒有意義。一個wcf服務已經是一個訂閱者 - 它可以被其他生物調用,通過調用它來「通知」它。

如果您希望您的服務「通知」其他服務,只需調用這些其他服務,就像您通常所稱的那樣。

+0

我最初做了一些研究,看到http://stackoverflow.com/questions/1591829/prism-and-wcf-do-they-play-nice?rq=1,它讓我想到WCF和Prism事件可能會附和。如果我使用基礎架構模塊來訂閱事件,並且可以減輕無實例用戶的可能性,那麼我可以解決問題。你同意或者我應該放棄這種方法。感謝您的輸入。 –

+0

另外請檢查我的編輯:) –

+0

如果發生這種情況發生在服務器上,讓其他一些長壽命物體成爲訂戶。具體來說,看看應該爲這種長期生活任務提供基礎設施的Hangfire庫。 –