WCF OperationContract - какой общий тип коллекции я должен предоставить? - PullRequest
9 голосов
/ 19 февраля 2010

У меня есть веб-сервис WCF, у которого есть метод, который возвращает универсальную коллекцию.Теперь мой вопрос: я должен выставить это как ICollection<T>, List<T>, IList<T>, IEnumerable<T> или что-то еще?

Я полагаю, что List<T> не может быть и речи, поскольку я хочу избежать CA1002 ошибок , но базовый тип будет List<T>.

Яочень интересно услышать ваши взгляды на это, желательно с хорошим объяснением того, почему вы думаете, что вы думаете.

Заранее спасибо

Ответы [ 2 ]

17 голосов
/ 19 февраля 2010

Имейте в виду, что такие ошибки, как 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 предполагает, что он может быть частью запроса или ответ , и если он является частью запроса , то тип должен быть конкретным и не может быть неизменным .Это причина всех других глупых ограничений, таких как требование установки свойств.

У вас просто нет выбора, кроме как использовать конкретный, изменяемый тип коллекции, и в большинстве случаев это означает либо массив, либо общий список.

6 голосов
/ 19 февраля 2010

По моему мнению, контракты на обслуживание и данные, которые раскрывают последовательности, должны четко сигнализировать, что эти последовательности неизменны , поскольку они передаются по проводам как DTO . Нет смысла добавлять и удалять последовательность, полученную из другого уровня. Скорее, вы хотите прочитать эти данные и что-то с ними сделать.

Учитывая это, я бы действительно предпочел использовать IEnumerable<T>, но, к сожалению, это не очень хорошо работает с WCF. Вы можете получить всевозможные странные ошибки, особенно когда речь идет об отложенном выполнении, поэтому (в контексте WCF) лучше держаться подальше от них.

Это на самом деле оставляет только массивы , так как они лучше всего взаимодействуют из оставшихся вариантов.

...