由於個人習慣使用自定義實體類,所以在寫web服務時常常返回的是實體類或是它的陣列。剛開始還可以,但時間一長,老覺的預設的方法在共享型別上太麻煩。直到最近才發現只要小小的一點改變就可以解決問題。因為自己已經走了很長時間的彎路,所以不希望大家也和小弟犯同樣的錯誤,就在此斗膽把自己的心得和一些想法寫出來。
舉例來說:
有這樣的乙個專案
remotegetobj
裡面有3個子專案: 乙個
類庫obj_lib;乙個
web
服務retobj_webser;乙個
winform
clientfrom
其中
retobj_webser 和
clientfrom 引用
obj_lib 而
clientfrom又引用
retobj_webser web服務
obj_lib 的資料定義如下:
<
serializable()
>
_public
structure baseobj
structure
baseobj
public
sname
asstring
end structure
web 服務
retobj_webser 義如下
<
webmethod()
>
_public
function getobjwebser()
function
getobjwebser()
asobj_lib.baseobj
dimret
asobj_lib.baseobj
ret.sname ="
hello world
"return
retend function
客戶端
clientfrom 如果按預設的web服務**生成的**如下 '
在呼叫它的時候,getobjwebser 函式返回的是 [web服務名].baseobj,而不是它們共同引用的obj_lib.baseobj。兩個型別雖然型別名稱一樣 並且 資料結構也完全一樣。但由於命名空間的不同,.net會認為他們完全不同,所以不能用等號直接拷貝。
以前一直不以為這是個問題,無非再寫一次等量拷貝**,就是用一段機械性的**把乙個型別複製到另乙個**上。可後來發現隨著**量的上公升和實體類數量的增加,這種笨方法無論在**的可讀性、維護性和結構上不行;更令人不能忍受的是在效能和記憶體使用上完全的失敗。遺憾的是,當發現問題時為時已晚,大量的現有的重複**已經無法再修改了,所以當時用了個利用反射功能自動複製這些重複的類的方法 ,可無奈效能就此無法令人接受;最後在網上瘋狂學習,總算勉強搞了個用反射在執行時動態生成可執行**來完成複製類的功能,雖然穩定性不好,但畢竟混過了當時的任務。
1 、最簡單的方法: 修改**類的源**。
仔細看發現**類函式不是直接生成類返回的
public
function getobjwebser()
function
getobjwebser()
asbaseobj
dimresults()
asobject=me
.invoke(
"getobjwebser",
newobject(-
1) {})
return
ctype
(results(
0),baseobj)
end function
從上面可以看出幾個特點 invoke 後的服務名必須和函式名一致,我曾嘗試修改函式名結果返回了個「服務名無效」的錯誤。
第二行** 用ctype來手動制定返回資料的型別。
由此推測有如下可能
:invoke
函式可能利用反射,通過第乙個引數獲得當前函式的返回型別,再找到該型別的建構函式,建立乙個該型別的例項。利用
soap
返回的
xml ,根據
xml 節點查詢該型別是否有和
soap
裡的節點名稱一致的
field
,有的話賦值,沒得話跳過
。 那麼我們改動如下
public
function getobjwebser()
function
getobjwebser()
asobj_lib.baseobj
dimresults()
asobject=me
.invoke(
"getobjwebser",
newobject(-
1) {})
return
ctype
(results(
0), obj_lib.baseobj)
end function
結果,只要這麼小小的改動一下,web服務的**類就可以直接返回自定義的實體類。(當時發現時 狂**2小時,我的青春啊~~~白白浪費了)。後來再做了試驗,得到的結論是:不一定要原來的自定義實體類。任何型別,只要包含原來實體類裡有效資料相同的資料名稱就可了。eg:
<
serializable()
>
_public
structure classa
structure
classa
public
sname
asstring
end structure
也可以
這種方法快速有效,但有個小問題。web服務不是一次編寫就能好的,難不了要修改結構。
只要使用一次「更新
web引用」的命令,就又要修改一次原**。
實體類 自定義控制項 ?
實體類 自定義控制項 也許這可以成為我們編碼的乙個思路,既然一切皆是物件,那麼自定義控制項可否跟實體類繫結呢?乙個自定義控制項對應乙個實體類 可以按照不同的情況給出不同的實現,也可以算是mvc模式的乙個體現吧 資料庫表 實體類 使用者控制項 實際介面 資料庫表到實體類的我已經介紹過了,而且用過的人更...
關於自定義強型別實體類的一點困惑
不好意思,這個問題對我來說困惑了很久,問了很多人也沒解決,所以放到首頁請教一下大家,下午我就移走,謝謝了 新專案放棄了dataset而採用擴充套件conllectionbase類實現自定義實體類,專案中有如下困惑 1 表表關聯時候,那麼實體類的屬性就將是所有可能用到的字段的集合?那豈不是很多屬性?2...
自定義實體類在三層架構之間傳遞資料
自定義實體類是專門承載業務實體資料的類,一般將方法分離出來,只包含屬性和字段的定義。每個實體類對應資料庫中的乙個表,每個屬性對應表中的乙個相應的字段。使用實體類屬於物件導向程式設計的思想,將每個表封裝成對應的類。1 使程式更加靈活。如果資料庫發生了更改,只需要修改資料實體類的 其他層的 修改量很小。...