2010年6月4日星期五

當然,Flex Remoting 是 Call by Value

最近測試 WebORB,發現一個問題,若是 .NET 程式中,A.dll 中的 PackageA.ClassA,提供了 getB() 的 method,但是回傳物件是屬於 B.dll 中的 PackageB.ClassB 的話,當 invoke getB() 時便會發生 gateway 解析不出自定類別物件 ClassB 的情況。



只能先猜,他無法跨 dll 找類別,畢竟每次呼叫 沒有必要的話 應該不會將 bin 下的所有 *.dll 都巡一遍。



所以,只要將 PackageA.ClassA 與 PackageB.ClassB 放在同一個 *.dll 中,執行就會正常了:







接著,進入主題,根據 codegen 出來的 AS3 程式碼:ClassLibraryFactory.getObj() 取得的 ClassLibrary,是一個不帶 method() 的 ValueObject:



雖然在 .NET 的 ClassLibrary 類別中,有 getMessage() 的 method:


然而在 AS3 ValueObject 中,只帶有 public member data,不會有任何 method;這個 VO 會被用來傳遞給 Flash 端,不會是將 Server 端、記憶體中的 ClassLibrary 物件參考,傳給 Flash,因此當然 Flash 也無法利用拿到的物件 作任何遠端呼叫。




另一個 ClassLibraryLib.ClassLibrary 透過 codegen 產出的 AS3 code,則是提供給 Flash 端進行 RPC call 的 proxy,所以裡面沒有 public member data,只有 public method:





基於這些基本關係,如何設計 Flex Remoting 的 service interface 就變得需要花點腦筋。




其他有些參考資源:

Mapping Server Side Classes to Flex via Flex AP
http://support.themidnightcoders.com/knowledgebase.php?act=art&article_id=87

ActionScript and .NET client-server class mappings
http://www.adobe.com/devnet/flex/articles/class_mappings.html

.NET Attributes in WebORB 2.1
http://www.themidnightcoders.com/blog/2006/05/net-attributes-in-weborb-21.html

如果要作 call by reference 的話,或是某種程度上來達到相似的意義的話,可能要再繼續研究一下 WebORB 如何將 .NET 的 Class 放在 Session 中。

0 意見: