2008-08-22 18 views
12

我注意到一些WCF應用程序選擇「拆分」它們的對象;也就是說,除了執行業務邏輯的有意義的類庫之外,項目還可能具有包含DataContracts/Members的DataObjects程序集。您在對象模型設計中遵循了哪些WCF最佳實踐?

這是一個不必要的抽象層次嗎?使用DataContract信息通過和標記現有類庫有沒有任何內在的弊端?

另外,如何處理錯誤條件?被拋出的服務異常(InvalidOperation,ArgumentException等)通常被接受,還是通常會有一個級別?

回答

17

將內部業務對象與數據合同/消息合同分開的關鍵原因是您不希望對應用程序進行內部更改,以便必須更改服務合同。如果您創建的是版本化的Web服務(具有超過1個版本的已實現的接口),那麼您通常擁有單個版本的應用程序業務對象,其中包含多個版本的數據合同/消息合同對象。此外,在複雜的企業集成情況下,您通常會有一些規範的數據格式(數據和消息契約),這些數據格式由許多應用程序共享,這迫使每個應用程序將規範數據格式映射到其內部對象模型。

如果您想要一個工具來幫助分離數據合同/消息合同等的細節,請查看微軟的Web服務軟件工廠http://msdn.microsoft.com/en-us/library/cc487895.aspx,該工廠有一些用於解決WCF管道的良好配方。

關於外部事件,WCF會自動將所有異常封裝在FaultExceptions中,這些異常被序列化爲線路格式錯誤。

也可以拋出通用故障異常,允許您指定附加的詳細信息以包含在序列化故障中。因爲由Web服務操作引發的故障是其合同的一部分,這是一個好主意,宣佈在操作聲明故障:

[FaultContract(typeof(AuthenticationFault))] 
[FaultContract(typeof(AuthorizationFault))] 
StoreLocationResponse StoreLocation(StoreLocationRequest request); 

無論是AuthenticationFault和AuthorizationFault類型代表的其他詳細信息被序列化和發送過來導線可拋出如下:

throw new FaultException<AuthenticationFault>(new AuthenticationFault()); 

如果你想要更多的細節然後喊;我一直生活和呼吸這種東西很長一段時間,我幾乎要靠這種方式謀生;)