2008-08-09 78 views
7

我還是新來的ASP.NET世界,所以我可以離開這裏基地,但到目前爲止,這是我的(有限)知識!ASP.NET Web服務結果,代理類和類型轉換

可以說我在業務名稱空間中有一個標準業務對象「Contact」。我編寫了一個Web服務來從數據庫中檢索聯繫人信息,並將其返回。然後,我寫一個客戶端應用程序來請求所述細節。

現在,我還創建了一個實用的方法,它需要一個「聯繫人」,並與它做一些魔術,如Utils.BuyContactNewHat()說。當然需要Business.Contact類型的聯繫人。

然後我回到我的客戶端應用程序,並且想要使用BuyContactNewHat方法,因此我添加了對我的Utils命名空間的引用,它就在那裏。然而,一個問題出現了:

Contact c = MyWebService.GetContact("Rob); 
Utils.BuyContactNewHat(c); // << Error Here 

由於GetContact返回類型是MyWebService.Contact而不是Business.Contact預期。我明白爲什麼會這樣,因爲在訪問Web服務時,實際上是針對由WSDL生成的代理類進行編程。

那麼,有沒有一種「更容易」的方法來處理這種類型的不匹配?我正在考慮嘗試創建一個通用轉換器類,它使用反射來確保兩個對象具有相同的結構,而不僅僅是將值從一個轉移到另一個。

回答

4

您正處於正確的軌道上。要將來自代理對象的數據返回到您自己的對象之一中,您必須執行左側 - 右側代碼。即複製屬性值。我敢打賭,你已經有了一種使用反射的通用方法。

如果某些人只想通過網絡獲取業務對象,則會使用除Web服務(.net遠程處理)之外的其他人。或者他們會使用二進制序列化。我猜你正在使用Web服務的原因,所以你必須做財產複製。

4

實際上您不必使用WSDL爲您提供的生成類。如果你看看它生成的代碼,它只是調用一些.NET框架類來提交SOAP請求。在過去,我已將該代碼複製到一個普通的.cs文件並對其進行編輯。雖然我沒有具體嘗試過,但我沒有看到沒有理由不能刪除代理類定義,並使用原始類來接收SOAP調用的結果。它必須已經在引擎蓋下進行反思,它做兩次似乎是一種恥辱。

1

我建議你看看寫一個Schema Importer Extension,你可以用它來控制代理代碼的生成。這種方法可以用於(平穩地)解決問題而不會發生任何問題(例如將對象從一個名稱空間複製到另一個名稱空間,或修改代理生成的reference.cs類,以便在下次更新Web引用時替換它)。

下面是關於這個問題的(很)好教程:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx