将Structs与WCF服务一起使用
有没有关于使用结构作为WCF服务的返回类型的官方建议?
我目前正在与我没有写的服务进行互动,并发现自己受到启发,要求查看我的烦恼是否合理。
我过去总是使用类 – 可能部分是因为这是样本总是显示的,但正如我现在想的那样,出于其他“直观”的原因:
-
我通过定义一个单独的项目开始了契约风格,这个项目的接口代表了服务来回传递的类型。
-
我使用LINQ很多,因此对于可空性的测试是隐含的引用类型,而对于结构和其他值类型,我总是需要标记为可空。
虽然我承认它比我脑子里的项目符号列表更直观,但是有些东西会马上来找我。 我想问这个问题,因为我正在处理一个返回结构的服务,并且在处理返回值时必须写:
var foo = Bar.Value.MyField;
代替
var foo = Bar.Value;
如果你可以创建一个结构并在其上放置一个[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问题:
我什么时候应该使用结构而不是类?
但是,由于WCF实际上是关于消息传递(即您的客户端进行方法调用,该调用及其参数将转换为序列化消息,该消息通过线路发送,然后在另一端重新组装并转回方法我没有看到使用struct
任何令人信服的理由。
一般.NET的所有好处并不真正适用于WCF的SOA世界,我会说(你不会传递类或结构实例 – 见上文)。