2011-07-05 53 views
4

我有一個可以返回多個不同集合的WCF服務。在WCF客戶端中連接返回的對象實例

每個集合中的對象都可以引用其他集合中的對象。例如。我有一系列的訂單和一批顧客。客戶對象包含一系列訂單參考,每個訂單都包含客戶參考。

我想知道人們通常在客戶端如何處理這種事情。據我所見,我的選擇是:

1)讓WCF完整地串行化任何成員對象,不要擔心重複。我知道我可以使用[PreserveReferences]在某種程度上緩解這種情況,但仍然存在大量的重複和不必要的序列化。也就是說,如果我從服務請求客戶對象,它會將客戶所有訂單的所有成員序列化,即使我的訂單集合中已經有客戶端的這些對象。這也意味着我必須小心地按照Id來匹配事物,而不是僅僅比較實例。

2)Serialise Id的實例,而不是實例。這看起來似乎是最明智的做法,但意味着我必須在某些地方將客戶端的這些Id再次變成實例。這帶來了一大堆的問題,以及如何注入所需的存儲庫來完成接線。

3)只需在客戶端的每個地方使用Id,而不是連接實例。這對我來說只是感覺不對,並且離開了OOP的全部。我不必訪問對象上的集合,而必須訪問id的集合,然後通過某個全局存儲庫查找它們。

目前我傾向於2,但我不喜歡這將是串行化混亂。

我應該注意的是,客戶端可能比大多數WCF客戶多了很多狀態,並保持與回調等,以保持其藏品的開放連接到服務,因爲它顯示的是實時數據。

乾杯

回答

0

在我的腰帶上有12個月的經驗我以爲我會用我的解決方案更新這個。

我現在使用單獨的DTO對象通過WCF進行序列化。其中一些使用id,一些包含完整的對象圖。使用DTO的優點在於,我可以根據調用者的需求返回不同格式的相同業務對象。

在客戶端我實際上有兩層。 DTO可以直接從服務中直接使用(通過請求僅包含我需要的完整對象圖),但是我還在客戶端維護一組業務對象存儲庫。這些回購利用DTO使用id來更新自己,並且在DTO被轉換爲業務對象的時候完成引用的接線。正如我在OP中所說的,我的客戶端比大多數WCF客戶端更具有狀態性,並且回購站還使用更新的對象監聽服務回調。

結果是,客戶端代碼可以使用客戶端回購,就好像它們在服務端運行一樣,並且可以連接對象引用而不必在線路上重複信息。

1

我認爲另一種選擇是不檢索默認情況下的數據收集。使用您的示例,我可以定義多個WCF方法:

ListCustomers() - 返回客戶對象,但不填充訂單集合 ListOrders() - 返回訂單對象,每個對象都附帶一個客戶對象,但客戶對象沒有訂單信息。

ListOrdersForCustomer(id customer) - 返回特定客戶的訂單。

當然,這有它自己的缺點,但可能適用於您的示例。