我必须实现一个公开值列表(整数、自定义类等)的web服务。我的工作解决方案返回List<T>
,根据FxCop,最好返回Collection<T>
或ReadOnlyCollection<T>
。
如果我选择返回ReadOnlyCollection<T>
,web服务会显示一个错误,如:
要实现XML序列化,从
ICollection
继承的类型必须在其继承层次结构的所有级别都实现Add(System.Int32)
。System.Collections.ObjectModel.ReadOnlyCollection
1
[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
不实现Add(System.Int32)
。
您最喜欢在内部使用List<T>
并公开Collection<T>
的方式是什么?(使用C#,最好仅使用框架2.0)
List<T>或集合<T>在这种情况下都很好。
就原始问题而言,您可以将List<T>在集合<T>很简单:
List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);
这是一个真正的包装;向包装器(col)添加一个项,它就会被添加到列表中。这可能有点令人困惑,因为许多这样的构造函数使用参数来进行初始填充,但不链接到原始列表。集合<T>是一个例外-p
由于您处于web服务边界,FxCop的建议不适用。这很有用(与Eric Lippert最近的博客一致),可以防止调用者践踏被调用者的内存,但在web服务分布式场景中,这根本不适用。事实上,由于web服务在某些通用场景中存在一些有据可查的问题,因此一个简单的数组在web服务边界上可以说是非常有用和实用的。在Eric的博客中——在这种情况下,不存在调用者/被调用者的问题,因为两者之间存在强制屏障。
就WSDL/mex而言,我怀疑所有3个(list/collection/array)都将成为一个元素块,因此您可以选择最方便的元素。
我通常返回IList<T>来自WCF web服务:FxCop对此非常满意。不确定这是否适用于ASMX web服务。