2010-10-27 76 views
2

好吧,不太確定怎麼說,但會盡我所能。WCF - 複雜對象 - 已知類型

我有很多的WCF服務,這是建立和運行,等待的對象進來進行處理。

WCFServiceA 
WCFServiceB 
WCFServiceC 

服務A將運行某些處理,並決定該對象發送到服務B或C.

所以我的對象具有在它和在所有屬性的所有類[數據成員] [DataContract]屬性。

到目前爲止這麼好。

但現在我也從我的對象失去所有的功能,因爲這是現在基本對象的序列化版本。

因此,如果我想使用一個完整的複雜對象在所有3個服務中包含相同的程序集作爲參考並以「KnownTypes」的形式發送對象,那麼最佳實踐是什麼?爲使用不知道這些類型的服務的任何東西提供基本的DataContractDataMember,以便它們仍然可以創建這些對象以供服務運行?

希望我的措辭正確,你明白我的問題在這裏。

:編輯: 要嘗試和澄清。

我送可以附加給它的「政策」的對象,這一政策對象是類,可以分爲幾種類型,車輛,房屋,生活,寵物政策等

但實際的一個類型將不會被接收服務知道。因此需要KnownTypes。

我想我只是回答了我自己的問題! :)

+0

我不太清楚你的問題,但KnownType用於指示到串行的實體polymorphicism是可以預期的。 http://msdn.microsoft.com/en-us/library/ms730167.aspx。如果你能避免多態對象那麼好。使用[KnownType]裝飾在客戶端和服務器之間共享實體程序集肯定有效 - 另一種方法是在反序列化期間將已知類型添加到客戶端。 – StuartLC 2010-10-27 14:07:15

+0

我不完全理解你的評論....多態是重載方法,所以我們可以調用多個簽名相同的方法,通過線路發送的對象被序列化爲值類型的對象,沒有簽名方法不發送。 (我甚至不認爲這是可能的)。 – jimplode 2010-10-27 14:17:21

+0

您是否在服務中使用了相同的數據合約程序集,或者您是否生成了這些程序集? (即是否使用重用類型功能) – 2010-10-27 14:24:12

回答

1

這是一個很好的解釋問題。我在這種方法中看到的缺點是,如果您要更新對象,比如添加新屬性或刪除一些內容,則需要使用新程序集更新所有3個服務。

已知類型的應用可以在需要時升級取決於安裝在現場的對象有時會導致向後兼容性問題。

或者只與屬性創建DTO(數據傳輸對象)和整個服務將它作爲數據合同和在到可以由服務來引用一個輔助類剝離複雜的邏輯。