天天看點

Contract-First, the key of Service-Oriented

說到“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>

可以看到,上面的方式完全不同于傳統的代碼-&gt;加上[WebMethod]-&gt;自動由.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,如需轉載請自行聯系原作者

繼續閱讀