|
上一節我們學習了WCF分布式開發步步為贏(5)服務契約與操作重載部分。今天我們來繼續學習WCF服務契約繼承和服務分解設計相關的知識點。WCF服務契約繼承有何優勢和缺點?實際項目里契約設計有什么原則和依據?面向對象的設計經驗有何值得借鑒的地方?這里我們會一一給出詳細的介紹。本文首先介紹的是WCF服務中契約繼承的一些概念、例子代碼分析,其次來講解服務契約的設計問題。首先介紹的也是進行服務設計的必要性,服務設計的原則,示例代碼分析。最后是全文的總結部分。結構如下:【1】OO面向對象設計原則,【2】服務契約繼承,【3】服務契約分解概念,【4】服務契約分解原則,【5】服務契約分解代碼分析,【6】總結。
【1】面向對象設計原則OO:
這里我們有必要先回顧一下面向對象的經典的設計原則。這些設計原則對我們WCF服務契約的設計來說有重要的參考價值。服務契約實際利用了接口來定義實現,語法類似,WCF框架也是基于現有的語言體系,對此擴展了編程模型,比如增加了屬性設置機制等。如果你曾經接觸過OO面向對象的這些概念,那么這些設計原則理解起來不會困難。很多編程書籍里都會有介紹,設計模式相關書籍里會有比較詳細的介紹。這里介紹幾個主要的概念,為下文的繼承和設計WCF服務契約部分作鋪墊:
<1>單一職責原則(SRP): 一個類應該僅有一個引起它變化的原因。
<2>開放封閉原則(OCP): 類模塊應該是可擴展的,但是不可修改(對擴展開放,對更改封閉)。
<3>Liskov 替換原則(LSP): 子類必須能夠替換它們的基類。
<4> 依賴倒置原則(DIP): 高層模塊不應該依賴于低層模塊,二者都應該依賴于抽象。 抽象不應該依賴于實現細節,實現細節應該依賴于抽象。
<5>接口隔離原則(ISP): 不應該強迫客戶程序依賴于它們不用的方法。
【2】服務契約繼承:
服務契約的定義和接口定義類似,接口可以繼承與多個接口。但是WCF契約屬性是不支持繼承的。由于WCF框架自身的問題,不支持契約屬性的繼承,因此這給我們服務契約屬性的聲明和使用卻有不少限制。在使用契約繼承屬性的過程中腰注意服務端契約的屬性繼承問題,此外就是客戶端添加服務引用后,無法還原服務端契約層級的關系,所有的操作契約由一個契約類封裝。因此實際編程我們要兼顧到兩個方面的情況。
【2.1】服務端契約層級:
接口支持繼承。但ServiceContract特性不支持繼承的,我們查看其實現代碼可以知道Inherited = false,即不支持繼承,部分代碼如下:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface, Inherited =false, AllowMultiple = false)]
public sealed class ServiceContractAttribute : Attribute
{

}
【3】服務契約分解概念:
下面我們繼續講解服務契約設計的一些概念知識。其實服務契約的設計在WCF分布式應用項目中屬于比較重要的部分。服務契約的設計和實現相對來多比較復雜,除了注意已有的設計原則之外還要注意WCF契約相關的特性。面向服務分析與設計的屬于一個較新的領域。實際的服務分析和設計我們還是借助于已有的經驗和原則,來指我們更好地設計服務契約。這也是本節給出一個面向對象重要設計原則的原因。
因為WCF服務契約的定義借助現有的編程語言如C#,契約設計實際首先就是對服務接口的設計。我們應該如何設計服務接口?如何知道服務接口中應該定義哪些操作?每個接口又應該包含多少操作?等等都是我們必須考慮的問題。Service Contract Factoring就是要考慮服務接口的分解問題。在面向服務的應用程序中,可重用的基本單元就是服務接口。因此如何設計服務接口就是重中之重。
【4】服務契約分解原則:
這里我們設計服務接口時候即遵循單一職責和接口隔離等原則,又要考慮系統的開發成本。合理的接口是專業的、松耦合的、規則化和可重用的接口。這些優勢同樣有利于整個系統的松耦合和可重用等特性。總的來說,契約分解的目的就是使接口包含的更少操作。
如果我們定義了太多的細粒度服務接口,雖然它們易于實現,但集成它們的代價太高。如果我們僅定義了一個復雜的服務接口,雖然集成的成本會降低,但卻接口的實現和可維護性較差。我們設計面向服務的系統時,需要平衡兩個影響系統的因素,接口成本和集成成本。參見下圖。

【5】服務契約分解代碼分析:
這里我們來講解一個簡單的服務契約設計的例子。這里我們還繼續使用交通車為例子進行講解。
我們首先定義一個接口交通工具IVehicle,定義了如下:
[ServiceContract(Namespace = "http://www.cnblogs.com/frank_xl/")]interface IVehicle
{
//操作契約,跑,開的契約
[OperationContract]
string Run();
//操作契約,拉人、載人的契約
[OperationContract]
string Take();
//操作契約,運輸貨物的契約
[OperationContract]
string Carry();
}
NET技術:WCF分布式開發步步為贏系列的(6):WCF服務契約繼承與分解設計,轉載需保留來源!
鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。