Какой тип списка / коллекции лучше всего использовать в контракте данных WCF? - PullRequest
16 голосов
/ 27 февраля 2009

При определении контракта данных WCF, какой тип следует использовать для коллекций / списков?

  • Должно ли это быть ICollection , IList , T [] или ...?
  • Должен ли я использовать типы интерфейса или конкретные типы?
  • Какие компромиссы есть, чтобы рассмотреть?

Ответы [ 3 ]

13 голосов
/ 27 февраля 2009

примечание: я отвечаю на это с точки зрения клиента *1001* - то есть переключатель /collectionType:<type> на svcutil.exe (также доступен в IDE).

Лично я стараюсь быть проще и использовать List<T>. Если вы собираетесь выполнять связывание с большим количеством данных, BindingList<T> может быть вариантом, но для свойств объекта это обычно избыточно. Массивы очень усложняют жизнь ... избегайте их; -p

Обратите внимание, что в .NET 3.5 функции, доступные для каждого типа коллекции, размываются благодаря методам расширения Enumerable.

Как правило, Collection<T> полезен, когда вы думаете, что вы можете создать подкласс для коллекции, чтобы использовать точки расширения virtual. Это действительно не вариант с WCF.

Как уже говорилось, использование IList<T> и т. Д. Не подходит, если вы не используете совместное использование сборок, поскольку сгенерированный класс не сможет создать коллекцию.

1 голос
/ 27 февраля 2009

Нельзя использовать тип интерфейса в datacontract, поскольку сериализатор не будет работать со свойствами типа интерфейса.

Вы можете использовать бетон типа, например. MyClass [] или Список

0 голосов
/ 27 февраля 2009

Помимо того, что вы не можете использовать типы интерфейса, на самом деле не имеет значения, какой из типов коллекций вы используете. Клиент вашего сервиса никогда их не увидит.

Помните, что веб-сервисы предоставляют описание сервиса клиенту в терминах WSDL или mex. В случае WSDL клиент получит схему XML, описывающую сообщения, которые будут отправлены и получены. В случае коллекции клиент просто увидит элемент с maxOccurs = "unbounded" вместо элемента с maxOccurs = "1". Клиент может интерпретировать это как массив, или список, или что-то еще. Независимо от того, какую коллекцию вы вернете из своего сервиса, клиент увидит maxOccurs = "unbounded" и интерпретирует его как хочет.

Исключением будет возвращение какого-либо словаря, и я не знаю, как это работает.

...