WCF OperationContract – 我应该公开哪种通用集合类型?
我有一个WCF Web服务,它有一个返回generics集合的方法。 现在,我的问题是:我应该将它暴露为ICollection
, List
, IList
, IEnumerable
还是其他什么?
我想List
是不可能的 ,因为我想避免CA1002错误 ,但底层类型将是List
。
我真的很想听听你对此的看法,最好能够很好地解释你为何如何思考自己的想法。
提前致谢
请记住,CA1002等错误确实适用于库。 WCF服务不是库,它是通过SOAP,REST等序列化所有内容的端点。
您会发现,如果您尝试公开诸如ICollection
或IList
,您将收到无法序列化类型的错误。 事实上, List
可能是这里的最佳选择。 当客户端生成代理时,默认情况下它会以数组forms结束,如果不是大多数人,很多人会将其更改为List
,所以90%的时间,无论您选择如何公开它,这是客户端无论如何都会看到的类型。
我会注意到,一般来说,最好不要从WCF操作或Web服务“返回”集合。 创建包含所需集合的代理类更为常见,并将其返回,即:
[OperationContract] OrdersResult GetOrders(OrderRequest request);
代理类可能如下所示:
[DataContract] public class OrdersResult { [DataMember] public List Orders { get; set; } }
这样,如果您决定需要向请求或响应添加更多数据,则可以在不对客户端进行重大更改的情况下执行此操作。
附录:WCF的真正问题是WCF不知道特定类型仅用于出站数据。 当通过WCF服务公开任何类时,WCF假定它可以是请求或响应的一部分 ,并且如果它是请求的一部分,则该类型必须是具体的并且不能是不可变的 。 这就是所有其他愚蠢限制的原因,比如要求财产制定者。
你在这里别无选择,只能使用具体的,可变的集合类型,在大多数情况下,这意味着数组或通用列表。
在我看来,暴露序列的服务和数据合同应该清楚地表明这些序列是不可变的 ,因为它们作为DTO在线路上传播。 添加和删除从不同层接收的序列没有多大意义。 相反,您希望读取该数据并对其执行某些操作。
鉴于此,我真的更喜欢使用IEnumerable
,但不幸的是,这对WCF不起作用。 你可以得到各种奇怪的错误,特别是在延迟执行时,所以(在WCF上下文中)最好远离那些。
这实际上只留下了数组 ,因为它们最好地传达了其余选项的意图。
上述就是C#学习教程:WCF OperationContract – 我应该公开哪种通用集合类型?分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1005398.html