我有一个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假定它可以是请求或响应的一部分,如果它是请求的一部分,则该类型必须是具体的,并且不能是不可变的.这就是所有其他愚蠢限制的原因,如要求财产设定者.
您在这里根本没有选择,但使用具体的,可变的集合类型,在大多数情况下,这意味着数组或通用列表.