2014-01-15 16 views
1

與我的問題相關的一點背景: - 我正在學習使用SignalR,它是一個客戶端 - 服務器RPC框架。在服務器端,您可以編寫一個或多個「集線器」類,從而公開可以遠程調用的方法,有點像Web服務。當一條消息到達時,SignalR實例化相應的集線器類來處理該消息,但爲此,集線器類必須具有無參數的構造函數。Castle Windsor - 不確定在哪裏釋放使用「container.Resolve」創建的瞬變

在現實世界中,集線器類可能需要依賴關係。幸運的是,SignalR允許你替換它所完成的默認「依賴解析器」。 SignalR Castle Windsor解析器有很多(幾乎相同的)樣本(例如here),但它們都依賴於調用Windsor容器的Resolve()方法。我對溫莎的理解是,你必須「釋放你明確解決的問題」,但是我看不到我能夠實現的目標。

請注意,集線器被註冊爲瞬態,而相關性可能是瞬態和單態的混合。

我想過在其Dispose()方法中釋放集線器的依賴關係,但這種感覺不對 - 集線器需要訪問Windsor容器;集線器也需要知道哪些依賴是暫時的,並且只是試圖釋放這些依賴。

有什麼想法?

回答

0

恕我直言,你被信號R依賴解析器無法實現用於釋放集線器的Destroy方法的事實困擾。

我同意在Hub的dispose方法中實現組件的發佈會變得相當難看。爲了從windsor釋放集線器,集線器需要呼叫釋放集裝箱,然後集裝箱再將集線器再次呼叫處理。

我認爲你最好的選擇是爲hub創建一個windsor攔截器,它將攔截集線器上的dispose呼叫。通過這種方式,只有攔截器需要知道容器,並且應該能夠處理組件。

您可能需要在攔截器中使用一些邏輯來確定是從SignalR還是從Windsor容器中調用dispose。 (即如果從SignalR調用Windsor釋放,否則繼續)。您可以通過使用例如Thread本地存儲來做到這一點。

+0

我不認爲會有一個優雅的解決方案!我擔心集線器會被實例化以便爲每個方法調用,所以如果事情沒有得到解決,存在內存問題。我想知道是否更容易將中心註冊爲單身人士?我知道SignalR在方法完成後調用集線器的Dispose(),所以只要我沒有在那裏做任何事情,我想我應該沒問題? (我使用自託管,而不是IIS,如果這有所作爲)。 –

+0

我對SignalR並不十分熟悉,但是一般情況下,我會假定一個對象在處置後不再可用。如果你要切換到單身人士,你能確定你永遠不需要同時使用Hub的兩個實例嗎? – Marwijn