2009-07-27 83 views
4

我有一個複雜的數據類型,包括一些函數,以及通常的get和get方法。如果我可以使用WCF,我的生活將會相當容易,因此我的客戶端也可以使用這種數據類型。我可以將WCF DataContract添加到複雜類型嗎?

難道我

  1. 忽略所有的操作,把[DataMemeber]只在需要的地方。

  2. 將有問題的類放在共享庫程序集中供客戶端和服務器訪問。

感謝, 羅伯託

PS。我意識到這個問題可能不是那麼完美。

回答

3

好吧,事實證明,這是以上所有答案的組合。

  1. 將數據類粘貼到從客戶端和服務器項目引用的共享程序集中。
  2. 確保您在「配置服務參考」對話框中選中了「引用裝配中的重用類型」項目。
  3. 在每個數據合約的開始處放置一個[KnownType]屬性。

代碼看起來像這樣:

[DataContract] 
[KnownType(typeof(WHS2SmugmugShared.Photo))] 
[KnownType(typeof(WHS2SmugmugShared.PhotoInfo))] 
public class Photo 
{ 
//code here 
} 

在上述情況下,我在照片類使用PhotoInfo。 PhotoInfo在類文件中沒有與它關聯的KnownType屬性。它似乎並不需要。

這允許您序列化複雜類型,但仍然保持其操作。

3

所有通過WCF邊界傳輸的都是序列化的 - 這相當於類的狀態。方法不會。所以,如果你需要它們可用於雙方,那麼你需要一個共享庫,如你所建議的。

當您添加服務引用時,您可以選擇重用數據類型,在這種情況下,WCF將反序列化到共享類中,並使用方法完成。但只有實際上已經跨越邊界轉移的字段值。

+0

我假設這將在「配置服務引用」對話框?它設置爲在所有引用的程序集中重用類型。它是否正確?? – 2009-07-27 12:05:13

0

簡短的回答:是的。 WCF處理像冠軍一樣的複雜類型。在傳遞複雜類型時,您只需關注傳遞的數據。如果您的客戶端不共享DLL,則更關注於傳遞的數據(而不是任何額外的操作),因爲客戶端只會獲得複雜類型數據成員的副本。

我猜你是來自Java背景?使用WCF,您需要使用DataMember屬性標記字段或(更好)將您的get/set方法更改爲屬性。

,而不是例如:

[DataContract] 
public class Foo 
{ 
    [DataMember] 
    private string bar; 

    public string GetBar() 
    { 
     return bar; 
    } 

    public void SetBar(string b) 
    { 
     bar = b; 
    } 
} 

您可以使用下列內容:

[DataContract] 
public class Foo 
{ 
    [DataMember] 
    public string Bar { get; set; } 
} 
1

的最佳實踐資料合約是它是一個合同 - 只與無行爲數據。第二種最佳做法是讓你用[DataMember]裝飾你的班級,並將其保留在服務器上 - 讓客戶端使用代理副本。

0

裝飾所有具有可序列化屬性的類型。因此,您不需要爲參與WCF服務的每個複雜類放置[DataContract]屬性。

在WCF客戶端添加包含thoes類型的dll,讓代理重用這些類,而不是重新生成deserilization所需的類。 如果任何類型被添加intoproxy刪除它並使用從DLL。 通過這種方式,我可以輕鬆地在服務中共享我的複雜類型。 但它只適用於如果你可以將你的類型分離爲單獨的dll。

相關問題