.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}{#}")] 與預設規則等效,且可自訂前綴/分隔符,兼具可讀性與唯一性。
掌握命名機制,能預測並控制元資料中契約名稱,避免跨組件、跨版本部署時的名稱衝突與導入混淆。