我有一個複雜的數據類型,包括一些函數,以及通常的get和get方法。如果我可以使用WCF,我的生活將會相當容易,因此我的客戶端也可以使用這種數據類型。我可以將WCF DataContract添加到複雜類型嗎?
難道我
忽略所有的操作,把
[DataMemeber]
只在需要的地方。將有問題的類放在共享庫程序集中供客戶端和服務器訪問。
感謝, 羅伯託
PS。我意識到這個問題可能不是那麼完美。
我有一個複雜的數據類型,包括一些函數,以及通常的get和get方法。如果我可以使用WCF,我的生活將會相當容易,因此我的客戶端也可以使用這種數據類型。我可以將WCF DataContract添加到複雜類型嗎?
難道我
忽略所有的操作,把[DataMemeber]
只在需要的地方。
將有問題的類放在共享庫程序集中供客戶端和服務器訪問。
感謝, 羅伯託
PS。我意識到這個問題可能不是那麼完美。
好吧,事實證明,這是以上所有答案的組合。
代碼看起來像這樣:
[DataContract]
[KnownType(typeof(WHS2SmugmugShared.Photo))]
[KnownType(typeof(WHS2SmugmugShared.PhotoInfo))]
public class Photo
{
//code here
}
在上述情況下,我在照片類使用PhotoInfo。 PhotoInfo在類文件中沒有與它關聯的KnownType屬性。它似乎並不需要。
這允許您序列化複雜類型,但仍然保持其操作。
所有通過WCF邊界傳輸的都是序列化的 - 這相當於類的狀態。方法不會。所以,如果你需要它們可用於雙方,那麼你需要一個共享庫,如你所建議的。
當您添加服務引用時,您可以選擇重用數據類型,在這種情況下,WCF將反序列化到共享類中,並使用方法完成。但只有實際上已經跨越邊界轉移的字段值。
簡短的回答:是的。 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; }
}
的最佳實踐資料合約是它是一個合同 - 只與無行爲數據。第二種最佳做法是讓你用[DataMember]裝飾你的班級,並將其保留在服務器上 - 讓客戶端使用代理副本。
裝飾所有具有可序列化屬性的類型。因此,您不需要爲參與WCF服務的每個複雜類放置[DataContract]屬性。
在WCF客戶端添加包含thoes類型的dll,讓代理重用這些類,而不是重新生成deserilization所需的類。 如果任何類型被添加intoproxy刪除它並使用從DLL。 通過這種方式,我可以輕鬆地在服務中共享我的複雜類型。 但它只適用於如果你可以將你的類型分離爲單獨的dll。
我假設這將在「配置服務引用」對話框?它設置爲在所有引用的程序集中重用類型。它是否正確?? – 2009-07-27 12:05:13