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

前端之家收集整理的这篇文章主要介绍了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假定它可以是请求或响应的一部分,如果它是请求的一部分,则该类型必须是具体的,并且不能是不可变的.这就是所有其他愚蠢限制的原因,如要求财产设定者.

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

猜你在找的C#相关文章