說到“Contract-First”,那麼就首先要補充一下這一句:“Services share schema and contract, not class”。
Contract-First絕對是設計Service-Oriented系統中最重要的原則和理念之一。如果要動手做一個Service-Oriented的東東,首先要領會的關鍵之一,就是Contract-First。Service對外公開的接口,應當就是一個Contract,這個Contract的作用就像是它自己對外說明:“我能夠提供哪些哪些服務,這些服務需要哪些哪些參數,會傳回哪些哪些值...”如果服務間需要傳遞資料,那麼也需要有Service和Client端公認的Contract,這個Contract用來說明:“我們要傳遞的這個資料,第一項是一個字元串用來包含姓名資訊的,第二項是一個整數,包含了一個年齡資訊...”由于Service間通常都會用SOAP包來交流,對于SOAP包的編碼格式等資訊,也需要用Contract來說明。
雖然已經有N多人在跟帖說“WebService != SOA”,但我還是要先拿WebService來說事兒。如何用Contract-First的概念來建構一個WebService呢?我們需要首先定義用來交換的資料的Contract(Data Contract),xsd就是用來定義資料Schema的。然後,我們再來定義Service和Client間進行通信的消息的Contract(Message Contract),别忘了Messsage-Based是Service-Oriented的基本特點之一。接着,根據這些由xsd來定義的Data Contract和Message Contract,生成我們的描述檔案wsdl。wsdl描述了Service的接口和其用到的資料結構。從wsdl,我們就可以生成用來支援開發的實際的類代碼檔案了。
可以看出,Contract-First的設計理念和平時我們用來建構WebService的方式大相徑庭。Contract-First的觀點是需要首先确定Service與Client進行互動的各種Contract,資料的、消息的、接口的,而不是我們先把實際的類代碼寫出來,然後給它加上“[WebMethod]”,使其成為WebService接口。
使用Contract-First建構WebService的好處,就是Contract是獨立的、可移植的、脫離于代碼的。由于我們可以使用xsd來描述Contract,是以隻需要和其他Service共享這些xsd描述檔案,那麼Service間就能共享這些Contract。我們不再需要讓另外的Service去引用包含了Person實體對象的程式集,才能達到對方Service能交換Person資料的目的。相反,我們隻需要共享出描述了Person結構的Data Contract給對方Service,即使對方Service可能是用Java實作的,它們也能根據這些Data Contract在它們的平台上生成實際的支援代碼,并以符合Contract的方式來和本地的Service交換Person資料。
下面的截圖出自WSCF:
定義的Data Contract:
<a href="http://blog.51cto.com/attachment/201003/121710451.gif" target="_blank"></a>
定義的Message Contract:
<a href="http://blog.51cto.com/attachment/201003/121716236.gif" target="_blank"></a>
Contract是由xsd檔案來描述的:
<a href="http://blog.51cto.com/attachment/201003/121722374.gif" target="_blank"></a>
最後,由Contract,自動生成WSDL描述檔案,然後從WSDL生成實際的支援代碼:
<a href="http://blog.51cto.com/attachment/201003/121731587.gif" target="_blank"></a>
可以看到,上面的方式完全不同于傳統的代碼->加上[WebMethod]->自動由.asmx?wsdl生成wsdl等步驟。
下面是Indigo裡面的一個Data Contract示例,Indigo裡面使用[DataContractAttribute]來辨別Data Contract:
[DataContract]
public class Person
{
[DataMember]
public String Name;
public DateTime Birthday;
}
下面就是一個Indigo Service接口示例,同樣是使用了Attribute來辨別Service Contract,和Service Contract中所包含的Service Operation:
[ServiceContract]
public interface IPersonService
[OperationContract]
Person GetPerson(String name);
void UpdatePerson(Person person);
public class PersonService : IPersonService
...
下篇Blog将會專門介紹Indigo。
本文轉自 kaneb0y 51CTO部落格,原文連結:http://blog.51cto.com/kaneboy/281329,如需轉載請自行聯系原作者