c# – WCF OperationContract – 哪个通用集合类型应该公开?

我有一个WCF Web服务,它具有返回一个通用集合的方法.现在,我的问题是:应该将其公开为ICollection< T>,List< T>,IList< T>,IEnumerable< T>或者是其他东西?

我想这个List< T>是我的问题,因为我想避免CA1002 errors,但底层类型将是一个列表< T>.

我真的很有兴趣听取你的看法,最好用很好的解释为什么你认为你的想法.

提前致谢

解决方法

请记住,像CA1002这样的错误真的适用于图书馆. WCF服务不是一个库,它是通过SOAP,REST等将序列化的端点.

你会发现,如果你尝试暴露一个接口,如ICollection< T>或IList T,您将收到类型无法序列化的错误.实际上,List< T>这可能是最好的选择.当代理在客户端生成时,认情况下最终以数组形式出现,并且许多(如果不是大多数人)将其更改为List< T>,所以90%的时间,无论你如何选择公开它,这是客户端将要看到的类型.

我会注意到,一般来说,很好的做法是不要从一般的WCF操作或Web服务“返回”一个集合.创建一个包含您想要的集合的代理类更常见,并返回,即:

[OperationContract]
OrdersResult Getorders(OrderRequest request);

代理类可能如下所示:

[DataContract]
public class OrdersResult
{
    [DataMember]
    public List<Order> Orders { get; set; }
}

这样,如果您决定需要向请求或响应添加更多数据,则可以这样做,而不会导致客户端的更改.

附录:这里使用WCF的真正问题是WCF不知道特定类型仅用于出站数据.当任何类通过WCF服务公开时,WCF假定它可以是请求或响应的一部分,如果它是请求的一部分,则该类型必须是具体的,并且不能是不可变的.这就是所有其他愚蠢限制的原因,如要求财产设定者.

在这里根本没有选择,但使用具体的,可变的集合类型,在大多数情况下,这意味着数组或通用列表.

相关文章

目录简介使用JS互操作使用ClipLazor库创建项目使用方法简单测...
目录简介快速入门安装 NuGet 包实体类User数据库类DbFactory...
本文实现一个简单的配置类,原理比较简单,适用于一些小型项...
C#中Description特性主要用于枚举和属性,方法比较简单,记录...
[TOC] # 原理简介 本文参考[C#/WPF/WinForm/程序实现软件开机...
目录简介获取 HTML 文档解析 HTML 文档测试补充:使用 CSS 选...