WCF數(shù)據(jù)契約特性剖析
WCF在開發(fā)領(lǐng)域中占據(jù)著一個(gè)比較重要的地位,我們可以通過本文介紹的關(guān)于對(duì)WCF數(shù)據(jù)契約的相關(guān)內(nèi)容來(lái)詳細(xì)了解一下這方面的相關(guān)知識(shí)。那么如何才能正確的應(yīng)用這方面的知識(shí)來(lái)幫助我們實(shí)現(xiàn)功能需求呢?#t#
WCF數(shù)據(jù)契約就是采用一種廠商中立、平臺(tái)無(wú)關(guān)的形式(XSD)定義了數(shù)據(jù)的結(jié)構(gòu),而WCF通過DataContractAttribute和DataMemberAttribute旨在給相應(yīng)的類型加上一些元數(shù)據(jù),幫助DataContractSerializer將相應(yīng)類型的對(duì)象序列化成具有我們希望結(jié)構(gòu)的XML。在客戶端,WCF的服務(wù)調(diào)用并不完全依賴于某個(gè)具體的類型,客戶端如果具有與服務(wù)端完全相同的數(shù)據(jù)契約類型定義,固然***。如果客戶端現(xiàn)有的數(shù)據(jù)契約類型與發(fā)布出來(lái)數(shù)據(jù)契約具有一些差異,我們?nèi)匀豢梢酝ㄟ^DataContractAttribute和DataMemberAttribute這兩個(gè)特性使該數(shù)據(jù)契約與之等效。
簡(jiǎn)言之,如果承載相同數(shù)據(jù)的兩個(gè)不同數(shù)據(jù)契約類型對(duì)象最終能夠序列化出相同的XML,那么這兩個(gè)數(shù)據(jù)契約就可以看成是等效的數(shù)據(jù)契約。等效的數(shù)據(jù)契約具有相同的契約名稱、命名空間和數(shù)據(jù)成員,同時(shí)要求數(shù)據(jù)成員出現(xiàn)的先后次序一致。比如,下面兩種形式的WCF數(shù)據(jù)契約定義,雖然它們的類型和成員命名不一樣,甚至對(duì)應(yīng)成員在各自類型中定義的次序都不一樣,但是由于合理使用了DataContractAttribute和DataMemberAttribute這兩個(gè)特性,確保了它們的對(duì)象最終序列化后具有相同的XML結(jié)構(gòu),所以它們是兩個(gè)等效的數(shù)據(jù)契約。
- [DataContract(Namespace = "http://www.artech.com/")]
- public class Customer
- {
- [DataMember(Order=1)]
- public string FirstName
- {get;set;}
- [DataMember(Order = 2)]
- public string LastName
- { get; set; }
- [DataMember(Order = 3)]
- public string Gender
- { get; set; }
- }
- [DataContract(Name = "Customer", Namespace = "http://www.artech.com/")]
- public class Contact
- {
- [DataMember(Name = "LastName", Order = 2)]
- public string Surname
- { get; set; }
- [DataMember(Name = "FirstName", Order = 1)]
- public string Name
- { get; set; }
- [DataMember(Name = "Gender", Order = 3)]
- public string Sex
- { get; set; }
- }
WCF數(shù)據(jù)契約版本的差異最主要的表現(xiàn)形式是數(shù)據(jù)成員的添加和刪除。如何保證在數(shù)據(jù)契約中添加一個(gè)新的數(shù)據(jù)成員,或者是從數(shù)據(jù)契約中刪除一個(gè)現(xiàn)有的數(shù)據(jù)成員的情況下,還能保證現(xiàn)有客戶端的正常服務(wù)調(diào)用(對(duì)于服務(wù)提供者),或者對(duì)現(xiàn)有服務(wù)的正常調(diào)用(針對(duì)服務(wù)消費(fèi)者),這是數(shù)據(jù)契約版本控制需要解決的問題。