首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 泛型與集合資料契約(上):泛型資料契約命名規則、名稱衝突解決與動態名稱模板

     編輯:關於.NET

.NET 2.0 引入泛型實現「演算法重用」,但面向服務領域無泛型概念。WCF 如何跨越 OOP 與 SOA 鴻溝,支援泛型型別定義資料契約?本文詳細解析泛型資料契約的預設命名規則、哈希值衝突解決機制,以及透過 DataContractAttribute.Name 動態模板顯式控制契約名稱。

一、泛型與資料契約的本質衝突

面向物件透過繼承重用代碼,泛型重用演算法;面向服務無繼承、無多載,亦無泛型。WCF 使命之一即彌合此差異,允許以泛型型別定義契約,內部將其具體化為唯一的非泛型契約。

二、預設序列化命名規則與哈希值作用

範例: Bill<BillHeader, BillDetail> 指定 OrderBillHeader、OrderBillDetail 序列化,根節點名稱:

BillOfOrderBillHeaderOrderBillDetail6Of3LqKh

結構:{型別名}Of{泛型參數1契約名}{泛型參數2契約名}...{泛型型別含命名空間哈希值}。哈希值確保不同命名空間同名泛型型別不衝突。

修改參數契約名稱(DataContract(Name="OrderHeader"))根節點相應變為 BillOfOrderHeaderOrderDetail6Of3LqKh,哈希值不變(針對 CLR 型別而非契約名)。

元資料發布時依此命名產生 XSD,Client 導入後型別名即為此拼接名(如 BillOfOrderBillHeaderOrderBillDetail6Of3LqKh)。

三、顯式指定契約名稱:靜態與動態模板

靜態指定: [DataContract(Name="OrderBill")] 固定名稱,但喪失泛型通用性。

動態模板(推薦): Name 支援佔位符:

  • {0}、{1}...:對應泛型參數順序的契約名稱
  • {#}:泛型型別哈希值

[DataContract(Name="BillOf{0}{1}{#}")] 與預設規則等效,且可自訂前綴/分隔符,兼具可讀性與唯一性。

掌握命名機制,能預測並控制元資料中契約名稱,避免跨組件、跨版本部署時的名稱衝突與導入混淆。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved