WCF
服務編程設計規範
(2):
序言、通用設計規範和要點。主要翻譯整理,序言、
WCF
設計通用設計規範、設計要點。並給出註釋。註釋內容於括號內。下一部分會整理,服務契約、數據契約、實例管理的內容。這裏放出的是中英文對照版。方便你們學習。最後翻譯結束,我會整理一個純中文版放出。若有錯誤,請批評指正。歡迎留言交流。
序言
對於一次成功的產品交付來講,完整編碼規範相當重要。這個規範能夠幫助強化一些通用的最佳實踐準則,並避免犯錯,方便整個團隊理解這些知識。一般,編碼規範都是至關的繁瑣,動輒上百頁,內容詳細敘述每一個編碼規則的基本原理。雖然這比沒有規範要好的多,可是一般開發人員難以理解和掌握。相反,《
WCF
編碼規範》只有
10
多頁,而且詳細介紹「是什麼」和「爲何」。我相信要徹底理解每一個編碼規則的精髓並恰當地應用這些規則,須要閱讀大量的書籍和多年的工做經驗。當有新人進入團隊時,你能夠快速地告訴他或她應該「先看看這個規範」。由於,徹底理解這些規範須要時間和今年感言,在此以前,咱們就應該遵照它。這裏涵蓋了一些經常使用的規則、缺陷、指南和建議。這裏會使用在《
WCF Master Class
》和《
Programming WCF Services
》(精通
WCF
課程和
WCF
服務編程)裏介紹的最佳實踐和
Helper Class
。
Juval Lowy
General Design Guidelines
通用設計規範
1.
All services must adhere to these principles:
全部的服務必須遵照這些原則:
a)
Services are secure.
服務是安全的。
b)
Service operations leave the system in a consistent state.
服務操做保證系統在一直的狀態。
c)
Services are thread-safe and can be accessed by concurrent clients.
服務是線程安全的而且能夠被併發的客戶端訪問。
d)
Services are reliable.
服務是可靠的。
e)
Services are robust.
服務是健壯的。
2.
Services can optionally adhere to these principles:
這些原則不是必須的。
a)
Services are interoperable.
服務是可互操做的
b)
Services are scale-invariant.
服務是能夠伸縮的
c)
Services are available.
服務是可用的
d)
Services are responsive.
服務是能夠相應的
e)
Services are disciplined and do not block their clients for long.
服務是遵照規則的,不能長時間阻塞客戶端進程。
Essentials
設計要點
1.
Place service code in a class library, not in any hosting EXE.
服務類應該定義在類庫而不是
exe
宿主裏。
2. Do not provide parameterized constructors to a service class, unless it is a singleton
that is hosted explicitly.
不要給服務類提供參數化的構造函數,除非其是
singleton
單例模式,而且肯定宿主。
3.
Enable reliability in the relevant bindings.
在相關的綁定裏啓用可靠性。
4. Provide a meaningful namespace for contracts. For outward-facing services, use your
company’s URL or equivalent URN with a year and month to support versioning.
For example:
爲契約定義有意義的命名空間。暴露的外部服務,使用公司的
URL
或
URN
,並附上年月日等支持版本化。
例如:
[ServiceContract(Namespace = "http://www.idesign.net/2009/06")]
interface IMyContract
{...}
For intranet services, use any meaningful unique name, such as
MyApplication
.
對於企業內部服務,使用惟一的有意義的名字,好比
MyApplication
。
For example:
例如
:
[ServiceContract(Namespace = "MyApplication")]
interface IMyContract
{...}
5. With intranet applications on prefer self-hosting to IIS hosting when the WAS is
unavailable.
對於企業內部應用系統,當
WAS
不可用的時候,推薦自託管
self-hosting
而不是
IIS
。
6. Do not mix and match named bindings with default bindings. Either have all your
bindings be explicitly referenced, or use only default bindings.
不要混用指定綁定和默認綁定。要麼所有明確指定綁定,要麼只使用默認綁定。
7. Do not mix and match named behaviors with default behaviors. Either have all your
behaviors be explicitly referenced, or use only default behaviors.
不要混用指定行爲和默認行爲,要麼所有明確執行行爲,要麼使用默認行爲。
8. Always name all endpoints in the client config file.
在客戶端的配置文件裏,定義終結點的名字
name.
9. Do not use SvcUtil or Visual Studio 2010 to generate a config file.
不要使用
SvcUtil
工具或者
Visual Studio 2010
去生成配置文件。(這裏工具會使用不少默認的設置,這些會帶來潛在的問題,在產品部署之後,好比TimeOut和MessageMaxSize等,最好本身能手動更改這些配置)
10. When using a tool such as Visual Studio 2010 to generate the proxy, do clean up the
proxy.
當使用
Visual Studio 2010
生成客戶端代理的時候,記得釋放代理。(這裏應該是重寫IDispose的Dispose方法,釋放非託管資源。Proxy默認是繼)
11. Do not duplicate proxy code. If two or more clients use the same contract, factor the
proxy to a separate class library.
不要複製代理代碼。若是兩個或多個客戶端使用了相同的契約,把代理分解到獨立的類庫裏。(這裏不建議複製Proxy代碼的方式。若是你有多個客戶端,好比A是一個Console程序,B是一個WindowsService程序,C是一個WinForm程序,都調用了相同的WCF服務,能夠把這個WCF客戶端放在一個類庫裏DLL,其它項目都引用便可)
12. Always close or dispose of the proxy.
一般要關閉或者銷燬(
close
或
dispose proxy
)代理實例。(客戶端代理包含網絡鏈接等珍貴資源,繼續釋放,調用Close方法或者在Using體力聲明客戶端代理便可)
13. When using discovery, prefer dynamic addresses.
當使用服務發現機制的時候,推薦動態地址。(動態定位服務地址是
WCF
服務發現的優點)
14. When using discovery, do support the metadata exchange endpoint over TCP.
當使用服務發現機制的時候,記得暴露支持
TCP
元數據交換的終結點。(這裏指的是
Ad-Hoc
模式,適用於企業局域網,提升數據交換速度)
15. When using discovery, avoid cardinality of 「some」.
當使用服務發現機制的時候,避免使用不肯定的基數
(WCF4.0
裏,查找終結點的個數,這裏明確數目,
FindCriteria.MaxResults = 1
)
備註:
WCF4.0服務發現的文章,你們有興趣能夠參考: