2009-11-20 44 views
11

有沒有關於使用結構作爲WCF服務的返回類型的官方建議?使用帶WCF服務的結構

我目前正在與我沒有寫的服務進行交互,並且發現自己的靈感來問我是否有必要擔心我的煩惱。

我過去一直使用的類 - 可能部分是因爲那是什麼樣一直顯示,但我現在想想,對於其他的「直覺」的原因:

  • 我開始合同風格通過定義一個單獨的項目來表示接口,這些接口表示服務將來回傳遞的類型。

  • 我使用LINQ很多,所以對可空性的測試是隱式的引用類型,而對於結構體和其他值類型,我總是需要標記爲可空。

雖然我會承認這比我腦海中的項目列表更直觀。我想過要問這個問題,因爲我處理返回結構服務以及具有返回值時務請寫:的

var foo = Bar.Value.MyField; 

代替

var foo = Bar.Value; 
+0

@David:更新了我的答案並附加了一些想法 – 2009-11-20 20:18:16

回答

17

如果你可以創建一個結構和在其上放置一個[DataContract]屬性 - 繼續使用它!對於WCF來說,這沒有什麼區別 - WCF只要求標記有DataContract屬性的類或結構以及要包含在序列化消息中的所有字段將被標記爲[DataMember]屬性。

如果檢查的DataContractAttribute MSDN文檔,它表明你可以用它在結構,以及:

[AttributeUsageAttribute(AttributeTargets.Class| 
AttributeTargets.Struct|AttributeTargets.Enum, 
Inherited = false, AllowMultiple = false)] 
public sealed class DataContractAttribute : Attribute 

更新:至於什麼時候使用,而不是一個類結構(一般在.NET),看到這個問題的SO這裏:

When should I use a struct instead of a class?

然而,由於WCF是真正關心的消息傳遞(即你的客戶端進行方法呼叫,該呼叫及其參數被轉換成一個序列化消息那得到仙然後在另一端重新組裝,然後轉回方法調用),但我沒有看到使用struct的任何令人信服的理由。

通用.NET的所有好處都不適用於WCF的SOA世界,我會說(你沒有在類或結構實例中傳遞 - 參見上文)。

+0

我的問題不在於是否可以完成,而是在適當的時候尋找上下文。 – t3rse 2009-11-20 19:36:34

+0

我首先看到了使用DTO的結構的原因:對GC的壓力較小,當DTO的壽命很短並且實例無法收集許多正在引用類型的好處時。但它取決於WCF內部。 – 2017-07-24 11:04:15