2010-02-19 75 views
9

我有一個WCF Web服務,它有一個返回泛型集合的方法。現在,我的問題是:我應該將它公開爲ICollection<T>,List<T>,IList<T>,IEnumerable<T>還是別的?WCF OperationContract - 我應該公開哪種通用集合類型?

我想List<T>是不可能的,因爲我想要避免CA1002 errors,但底層的類型將是List<T>

我真的很感興趣聽到你對此的看法,最好有一個很好的解釋爲什麼你認爲你的想法。

在此先感謝

回答

16

請記住,諸如CA1002等錯誤實際上是要應用於庫。 WCF服務不是一個庫,它是一個通過SOAP,REST等序列化所有內容的終端。

您會發現如果您嘗試公開諸如ICollection<T>IList<T>之類的接口,則會發現類型不能被序列化。實際上,List<T>可能是這裏的最佳選擇。在客戶端生成代理時,默認情況下會以陣列形式結束,如果不是大多數人將其更改爲List<T>,則無論您如何選擇公開該代理,90%的時間都是這樣無論如何,客戶將會看到。

我會注意到,一般來說,不要一般從WCF操作或Web服務「返回」集合是一種好的做法。這是比較常見的,以創建一個包含要收集的代理類,並返回,即:

[OperationContract] 
OrdersResult GetOrders(OrderRequest request); 

當代理類可能是這樣的:

[DataContract] 
public class OrdersResult 
{ 
    [DataMember] 
    public List<Order> Orders { get; set; } 
} 

這樣,如果你決定需要將更多數據添加到請求或響應中,您可以這樣做而不會導致客戶端發生重大更改。


附錄:這裏與WCF真正的問題是,WCF不知道某個特定類型僅用於出站數據。當任何類通過WCF服務暴露,WCF假定它可以是請求響應的一部分,並且如果它是一個請求的一部分,那麼類型必須具體不能是不可變的。這就是所有其他愚蠢限制的原因,例如需要屬性設置者。

在這裏你只是沒有選擇,只能使用具體的,可變的集合類型,而在大多數情況下,這意味着數組或通用列表。

6

在暴露序列我看來,服務和數據合同應明確信號,這些序列是不可改變的,因爲他們旅行過線爲的DTO。在從不同層次接收的序列中添加和刪除沒有多大意義。相反,您想要讀取這些數據並對其進行處理。

鑑於此,我真的更喜歡使用IEnumerable<T>,但不幸的是,這對WCF並不適用。你可以得到各種奇怪的錯誤,尤其是當涉及延遲執行時,所以(在WCF上下文中),最好遠離這些錯誤。

這真的只留下陣列,因爲他們溝通意圖最好的其餘選項。

+0

同意關於不變性的部分,儘管數組並不比通用列表更加不可變;只有*大小*是不可變的。 – Aaronaught 2010-02-19 14:58:23

+1

是的,我知道,這就是爲什麼我會更喜歡IEnumerable,但鑑於這不是一種選擇,我們必須滿足於次最佳。數組仍然比列表'更不可變',因爲你不能改變大小,所以他們更清楚地溝通意圖......但不是太多,我會授予:) – 2010-02-19 15:02:13

+1

Lol「更不可變」。我想這是一個很好的解釋。 :P – Aaronaught 2010-02-19 15:10:13

相關問題