2009-11-20 64 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