2009-09-02 41 views
2

在AppDomain中A我有一個對象o類型TT既不是Serializable也不是從MarshalByRefObject派生。類型T由我無法控制的插件主機提供。如何創建一個遠程對象的代理而不是派生自MarshalByRefObject?

我想創建一個AppDomain B並通過代理oB中的方法,但難倒:如何創建代理?

B中的方法應該能夠調用o上的方法並讀取屬性等。這些方法的結果必須以類似的方式進行代理。

回答

5

我建議您創建一個適當的代理對象,它實現與您嘗試代理的對象相同的接口,並且還從MarshalByRefObject繼承。然後您遠程代理對象。在服務器端,代理將委託給你的對象。

根據您的要求,服務器對象將包含您的對象作爲靜態(所有客戶端看到相同的對象)或非靜態(每個客戶端獲得新副本)。

對於靜態成員,您需要在服務器中創建代理並使用您的對象或第一個分配的代理(當第一個客戶端連接時)初始化它,然後創建對象並初始化它自己。我用過前者。

當然不要忘記租約。

2

你不能。在AppDomain之間進行通信的唯一方法是使用代理或使用副本(即可序列化)。

您可以將自己的類型包裝在代理中,該代理繼承自MarshalByRefObject並使用它代替?

3

如果你想有一個代理,你最好的選擇很可能是封裝的對象類型內部的確實繼承MarshalByRefObject(作爲一個私有域),以及具有公共方法等,使其可用;基本上是一個門面。

如果你想序列化 - 我會使用一個DTO是相關對象,但在一個不同的(可序列化)類型。只需發送狀態,並在另一端重建實際類型。

+1

是的,我一直在考慮一個門面。是否有用於創建*整個API的外觀的庫?我正在研究代碼生成現在... – 2009-09-02 08:19:29

+0

沒有我知道的 – 2009-09-02 08:22:21

相關問題