加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 06:33:34 所属栏目:百科 来源:网络整理
导读:我有一个WCF Web服务,它具有返回一个通用集合的方法.现在,我的问题是:应该将其公开为ICollection T,List T,IList T,IEnumerable T或者是其他东西? 我想这个List T是我的问题,因为我想避免CA1002 errors,但底层类型将是一个列表 T. 我真的很有兴趣听取你的
我有一个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假定它可以是请求或响应的一部分,如果它是请求的一部分,则该类型必须是具体的,并且不能是不可变的.这就是所有其他愚蠢限制的原因,如要求财产设定者.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读