代码之家  ›  专栏  ›  技术社区  ›  Klaus Byskov Pedersen

wcf operationcontract-我应该公开哪个泛型集合类型?

  •  9
  • Klaus Byskov Pedersen  · 技术社区  · 16 年前

    我有一个wcf web服务,它有一个返回泛型集合的方法。现在,我的问题是:我应该把它公开为 ICollection<T> , List<T> , IList<T> , IEnumerable<T> 或者别的什么?

    我想那是 列表& T; 不可能,因为我想避免 CA1002 errors ,但基础类型将是 列表& T; .

    我真的很想听听你的看法,最好能解释一下你为什么会这么想。

    提前谢谢

    2 回复  |  直到 16 年前
        1
  •  17
  •   Aaronaught    16 年前

    请记住,CA1002等错误实际上是应用于库的。WCF服务不是库,它是一个端点,通过SOAP、REST等对所有内容进行序列化。

    如果您尝试公开一个接口,比如 ICollection<T> IList<T> ,您将得到无法序列化类型的错误。事实上, List<T> 可能是这里最好的选择。当一个代理在客户端生成时,默认情况下它会作为一个数组结束,并且许多人(如果不是大多数人)会将其更改为 列表<t> 所以90%的时候,不管你如何选择暴露它,这是客户无论如何都会看到的类型。

    我要注意的是,通常最好不要从WCF操作或一般的Web服务“返回”集合。创建一个包含所需集合的代理类并返回该集合更为常见,即:

    [OperationContract]
    OrdersResult GetOrders(OrderRequest request);
    

    代理类可能如下所示:

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

    这样,如果您决定需要向请求或响应中添加更多的数据,那么您可以这样做,而不会对客户机造成破坏性的更改。


    附录:WCF的真正问题是 WCF不知道特定类型仅用于出站数据。 当任何类通过WCF服务公开时,WCF假定它可以是 请求 或A 响应 ,如果它是 请求 然后类型 必须是混凝土 不能是不可变的 . 这就是所有其他愚蠢限制的原因,比如要求财产设定者。

    您在这里除了使用具体的可变集合类型之外别无选择,而且在大多数情况下,这意味着要么是数组要么是泛型列表。

        2
  •  6
  •   Mark Seemann    16 年前

    在我看来,公开序列的服务和数据契约应该清楚地表明 序列是不可变的 ,因为它们是以 DTOS . 在从不同层接收到的序列上添加和删除没有多大意义。相反,您希望读取该数据并对其进行处理。

    鉴于此,我更愿意使用 IEnumerable<T> 但不幸的是,这在WCF中并不适用。您可以得到各种奇怪的错误,特别是在延迟执行时,所以(在WCF上下文中)最好远离这些错误。

    那真的只剩下 数组 因为他们传达了最好的其他选择的意图。