關於自定義實體類和Web服務之間的型別共享

2021-04-09 00:43:54 字數 3423 閱讀 3069

由於個人習慣使用自定義實體類,所以在寫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 使程式更加靈活。如果資料庫發生了更改,只需要修改資料實體類的 其他層的 修改量很小。...