Подтвердить что ты не робот

Какой тип списка/коллекции лучше всего использовать в контракте данных WCF?

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

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

Ответ 1

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

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

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

Обычно Collection<T> полезен, если вы считаете, что хотите подклассифицировать коллекцию, чтобы использовать точки расширения virtual. Это не вариант WCF.

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

Ответ 2

Вы не можете использовать тип интерфейса в datacontract, потому что сериализатор не будет работать с свойствами типа интерфейса.

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

Ответ 3

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

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

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