2010-01-07 38 views
2

問題:WCF對象,多個IList實現系列化錯誤

WCF合同對象無法實現2種類型的列表(即:列表和列表)。

囉嗦的解釋:

我對現有的核心繫統之上建立一個WCF服務,我試圖找出實現一些我的業務對象的最佳途徑。

核心系統採用的接口爲所有的業務對象 - 人的管理功能,例如,要求我通過它實現IPerson對象。這裏沒什麼不尋常的。

目標是讓一個聯繫對象(Person)可以在事物的服務端使用,並且還實現IPerson,以便它可以傳遞到核心而不需要轉換層。這一切對於像Person這樣的項目都很好。

問題出現在列表中:例如,核心中的方法可能需要傳入一個IPersonList,而且任何處理繼承泛型的人都知道,List不會從IList繼承。

在我們當前正在運行的ASMX服務,我們在web對象的一些向上/向下鑄造實現這一點。 「WebPerson」將從List繼承,並顯式實現IList,以便IList屬性不會顯示在WSDL上。

在WCF,但是,如果您嘗試使用此相同的對象,您將收到以下錯誤:

Type 'Cssi.IBroker.Service.Cssi.Contracts.PersonList' with CollectionDataContractAttribute attribute is an invalid collection type since it has multiple definitions of interface 'IList`1'.

顯然,現在,新的WCF串行知道如何序列化的IList,它不再能忽略第二個明確的實現。

如果可能的話,我想避免只爲合同創建PersonList對象,然後轉換並從IPersonList對象爲每個呼叫。更改核心業務邏輯以使用專爲WCF服務設計的具體對象不是一種選擇。

幫助!

+0

我應該補充一點,我們已經討論過的另一個選擇是拋出乾淨的WSDL設計,返回服務契約中的接口並將ServiceKnownType屬性添加到我們的契約中。因爲對於這個WCF服務,我們將控制服務和客戶端,這是一個選項,但是這有效地將任何未來的客戶綁定到使用.Net和我們的代理類,因爲我們的WSDL將無效。我寧願避免使用這個選項。 – mdryden

回答

0

我最終決定最佳路線是一組只對合同使用的專用對象。由於他們致力於完成一項任務,因此我能夠保持其清潔,無需爲了WSDL而犧牲我的內部設計。對於WSDL對象本身,我最終使用了數組而不是IList。

轉換的額外步驟是有點麻煩,但低於試圖讓我的核心對象WCF友好會。