[原創]談談WCF中的Data Contract(3):WCF Data Contract對Collection & Dictionary的支持
在本篇文章上一部分Order Processing的例子中,我們看到原本已Collection形式定義的DetailList屬性(public IList<TDetail> DetailList),在Data Contract中卻以Array的方式體現(public OrderDetail[] DetailList)。我們現在就來詳細地討論一下基于Collection & Dictionary 的Data Contract。
Data Contract for Collection
我們照例用例子來說明問題,在這里我們創建一個批量處理Order的Service,于是我們創建了一個OrderCollection Type:




















下面是Service Contract的定義:









面是OrderCollection 在XSD中的呈現:
























加上通過Add Service Reference默認生成的Class,我們可以很清楚地看出Collection是以Array的形式呈現的(Artech.SpecialDataContract.Client.OrderManagerService.Order[] orders):







因為Array相對很Common的數據類型,基本上所有的廠商均提供了對Array的支持,這也是WCF在通過Add Service Reference生成Client端代碼的時候,會生成Array的原因。不過并不是我們只有唯一的選擇,事實上VS為此提供了擴展,允許我們對于基于Collection 的Data Contract生成我們需要的各種類型,我們只需要在Add Service Reference的時候選擇“Configure Service Reference”進行相應的配置:
通過上面的截圖,我們發現在Collection Type一項我們有若干選項,我們可以選擇我們希望生成的數據類型:Array,ArrayList,LinkedList,Generic List,Collection和BindingList。
Data Contract for Dictionary
前面的內容,我們分別討論了基于Generic和Collection的Data Contract,接下來,我們來討論最后一個特殊的數據類型的Data Contract:Dictionary。
延續上面的Order Batch Processing的例子,不過我們現在處理的不是一個OrderCollection對象,而是一個Dictionary對象,線面是Service Contract和Order的定義:

























閑話少說,我們來看XSD:
























Data Contract的名稱為ArrayOfKeyValueOfguidOrder_SkVQi6O3=ArrayOfKeyValueOf+guid(Key的類型)+Order(Value)+_SkVQi6O3(Hash Value)。從該XSD的結構我們不難看出,只是一個數組,每個元素為Key-Value pair。
我們照例看看通過Add Service Reference方式生成的Client端code中的對應的定義:







生成的是一個System.Collections.Generic.Dictionary類型。同Collection一樣,也依然可以有多種選擇: