如何使用registerClassAlias來解決module中使用RemoteObject---第一次訪問正常、第二次出錯...

  問題:今天我在Flex的module中使用RemoteObject的方式與服務端進行AMF的遠程數據調用。第一次切換到module時是沒有問題的,但第二次切換到module時,發現總是報錯,無法完成遠程調用。爲此困惑極了。
  我在remoting訪問時,使用了一個自定義的參數類:
  package VO { [RemoteClass(alias="ServiceLibrary.SystemFramework .UserInfoSearchCondition")] public class UserInfoSearchConditionVO { public function UserInfoSearchConditionVO() { } public var UserName:String; public var DepartmentId:String; } } 這個定義裏使用到了:[RemoteClass(alias="ServiceLibrary.SystemFramework .UserInfoSearchCondition")]
  這就是本地對象與"遠程服務端類"的別名定義,這個大家都應該知道的。
  遠程調用時:
  var condition:UserInfoSearchConditionVO=new UserInfoSearchConditionVO(); condition.UserName=txtSearchUserName.text; var resp1:Responder=new Responder(onUserSearchCountSuccess,onUserSearchCou ntFaild); nc.call("ServiceLibrary.SystemFramework.UserInfoFa cade.GetUserInfoCountByCondition",resp1,condition); 但不知道爲什麼,在第一次Module時加載是可以的。在第二次加載module時,此"註冊"信息會丟失。
  解決方法:需要明確聲明此註冊信息,代碼如下: import flash.net.registerClassAlias; import mx.messaging.messages.RemotingMessage; import VO.UserInfoSearchConditionVO; registerClassAlias("ServiceLibrary.SystemFramework .UserInfoSearchCondition", UserInfoSearchConditionVO); 以上的代碼可以放在自己的module裏,或者也可以直接放在Application上,聲明一次也就可以了,子Module不需要更申明瞭。
  最後的代碼我帖出來,如果你能看懂就最好了,看不懂我也沒辦法了:)
   flex/spark" xmlns:mx="library://ns.adobe.com/flex/halo" layout="vertical" width="100%" height="100%" creationComplete="module1_creationCompleteHandler( event)" > 0) this.btnPrev.visible=true; else this.btnPrev.visible=false; if((curPage+1) * pageCount >=totalCount) this.btnNext.visible=false; else this.btnNext.visible=true; } protected function onUserSearchCountFaild(re:String):void{ Alert.show("獲取數據出錯!","出錯了"); } protected function onUserSearchSuccess(re:ArrayCollection):void{ gridUser.dataProvider =re; } protected function onUserSearchFaild(re:String):void{ Alert.show("獲取數據出錯!","出錯了"); } protected function btnNext_clickHandler(event:MouseEvent):void { // TODO Auto-generated method stub curPage++; BindGrid(); } protected function btnPrev_clickHandler(event:MouseEvent):void { // TODO Auto-generated method stub curPage--; BindGrid(); } protected function gridUser_itemClickHandler(eventistEvent):void { // TODO Auto-generated method stub this.currentState="edit"; } ]]--> width="100%" height="100%"> width="250" height="100%" title="用戶管理"> width="100%" height="29"> width="162"/> width="100%"/> width="100%" height="100%" itemClick="gridUser_itemClickHandler(event)"> width="100%" height="26"> width="100%" height="100%" dropShadowVisible="true" title="用戶信息" includeIn="edit"> width="100%" height="100%"> 最後,我再主張一下我的設計的原則:
  在客戶端與服務端進行遠程數據調用時,我不太主張採用"簡單參數"模式,比如查詢用戶功能吧,我可以使用username,deparmentId...等等參數來進行參數調用,但這樣有個擴展性問題:那就是當以後要添加"查詢條件"時,不得不修改接口。這就是會導致客戶端要修改N個調用地方,服務端也要進行接口修改,這就會帶來很大的擴展問題。
  因此,我建議可以自定義一個"Condition查詢類"與"服務端"的相對應,這樣接口的參數就只需要一個,而且類型不變。
  以後如果要擴展"查詢條件"時,只需要在"客戶端"添加一個屬性,並賦值就OK了。在"服務端"則也只要添加屬性,並修改實現代碼就OK了,不再需要修改兩端的"接口"了。。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章