Имейте в виду, что такие ошибки, как CA1002, действительно предназначены для применения к библиотекам.Служба WCF - это не библиотека, это конечная точка, которая сериализует все через SOAP, REST и т. Д.
Вы обнаружите, что если вы попытаетесь предоставить такой интерфейс, как ICollection<T>
или IList<T>
, выВы получите ошибки, которые тип не может быть сериализован.На самом деле, List<T>
, вероятно, лучший выбор здесь.Когда прокси-сервер генерируется на стороне клиента, он по умолчанию становится массивом, и многие, если не большинство людей, изменяют его на List<T>
, так что 90% времени, независимо от того, как вы решите выставить его, этотип, который клиент увидит в любом случае.
Я отмечу, что, как правило, рекомендуется вообще не «возвращать» коллекцию из операции WCF или веб-службы в целом.Чаще всего создается прокси-класс, который содержит нужную коллекцию, и возвращает ее, например:
[OperationContract]
OrdersResult GetOrders(OrderRequest request);
Где прокси-класс может выглядеть следующим образом:
[DataContract]
public class OrdersResult
{
[DataMember]
public List<Order> Orders { get; set; }
}
Таким образомесли вы решите, что вам нужно добавить больше данных либо в запрос, либо в ответ, вы можете сделать это, не вызывая критических изменений на клиенте.
Добавление: реальная проблема здесь с WCF заключается в том, что WCF не знает, что конкретный тип используется только для исходящих данных. Когда какой-либо класс предоставляется через службу WCF, WCF предполагает, что он может быть частью запроса или ответ , и если он является частью запроса , то тип должен быть конкретным и не может быть неизменным .Это причина всех других глупых ограничений, таких как требование установки свойств.
У вас просто нет выбора, кроме как использовать конкретный, изменяемый тип коллекции, и в большинстве случаев это означает либо массив, либо общий список.