将Structs与WCF服务一起使用

时间:2009-11-20 17:51:44

标签: c# wcf struct value-type

是否有关于使用结构作为WCF服务的返回类型的官方建议?

我目前正在与我没有写过的服务进行互动,并发现自己受到启发,要求查看我的烦恼是否合理。

我过去总是使用课程 - 可能部分是因为这是样本总是显示的,但正如我现在想的那样,出于其他“直观”的原因:

  • 我通过定义一个单独的项目来启动 contract 样式,该项目的接口表示服务来回传递的类型。

  • 我经常使用LINQ,因此对于可空性的测试是隐含的引用类型,而对于结构和其他值类型,我总是需要标记为可空。

虽然我承认它比我脑子里的项目符号列表更直观,但是有些东西会立刻传到我的身上。我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须写:

var foo = Bar.Value.MyField;

而不是

var foo = Bar.Value;

1 个答案:

答案 0 :(得分:18)

如果您可以创建一个结构并在其上添加[DataContract]属性,请继续使用它!对于WCF,这没有什么区别--WCF只要求使用标记有DataContract属性的类或结构以及要包含在序列化消息中的所有字段都标有[DataMember]属性

如果您检查DataContractAttribute上的MSDN文档,则表明您也可以在结构上使用它:

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

更新:至于何时使用结构而不是类(通常在.NET中),请参见此问题:

When should I use a struct instead of a class?

但是,由于WCF实际上是关于消息传递(即您的客户端进行方法调用,该调用及其参数将转换为通过线路发送的序列化消息,然后在另一端重新组装并返回进入方法调用),我没有看到任何令人信服的理由使用struct

一般.NET的所有好处并不真正适用于WCF的SOA世界,我想说(你不会传递类或结构实例 - 见上文)。