WCF OperationContract - который тип универсального набора я должен представить?

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

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

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

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

9
задан Klaus Byskov Pedersen 19 February 2010 в 14:48
поделиться

2 ответа

Помните, что такие ошибки, как CA1002, действительно должны применяться к библиотекам. Служба WCF - это не библиотека, это конечная точка, которая сериализует все через SOAP, REST и т. Д.

Вы обнаружите, что если попытаетесь открыть такой интерфейс, как ICollection или IList , вы получите ошибки о том, что тип не может быть сериализован. Фактически, List , вероятно, лучший выбор здесь. Когда прокси создается на стороне клиента, он по умолчанию превращается в массив, и многие, если не большинство людей, меняют его на List , поэтому в 90% случаев, независимо от того, как вы решаете раскрыть его, это тот тип, который клиент все равно увидит.

Замечу, что обычно хорошей практикой является вообще не «возвращать» коллекцию из операции WCF или веб-службы в целом. Чаще всего создается прокси-класс, содержащий нужную вам коллекцию, и возвращать ее, например:

[OperationContract]
OrdersResult GetOrders(OrderRequest request);

Где прокси-класс может выглядеть так:

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

Таким образом, если вы решите, что вам нужно добавить больше данных в любой запрос или ответ, вы можете сделать это, не вызывая критических изменений в клиенте.


Добавление: настоящая проблема здесь с WCF заключается в том, что WCF не знает, что определенный тип используется только для исходящих данных. Когда какой-либо класс предоставляется через службу WCF, WCF предполагает, что он может быть частью либо запроса , либо ответа , и если он является частью запрос , тогда тип должен быть конкретным , а не может быть неизменяемым . Это причина всех других глупых ограничений, таких как требование установки свойств.

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

17
ответ дан 4 December 2019 в 09:12
поделиться

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

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

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

6
ответ дан 4 December 2019 в 09:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: