При определении контракта данных WCF, какой тип следует использовать для коллекций/списков?
- Если это ICollection <T> , IList <T> , T [] или...?
- Должен ли я использовать типы интерфейса или конкретные типы?
- Какие компромиссы необходимо рассмотреть?
При определении контракта данных WCF, какой тип следует использовать для коллекций/списков?
Примечание. Я отвечаю на это с точки зрения клиента клиента, т.е. на /collectionType:<type>
на svcutil.exe
(также доступной в среде IDE).
Лично я стараюсь держать его простым и использовать List<T>
. Если вы собираетесь выполнять большую привязку данных, BindingList<T>
может быть опцией, но для свойств объекта она обычно является излишней. Массивы делают жизнь очень трудной... избегать их; -p
Обратите внимание, что с .NET 3.5 функции, доступные для каждого типа коллекции, размываются, благодаря методам расширения на Enumerable
.
Обычно Collection<T>
полезен, если вы считаете, что хотите подклассифицировать коллекцию, чтобы использовать точки расширения virtual
. Это не вариант WCF.
Как уже указывалось, использование IList<T>
и т.д. не является вариантом, если вы не используете совместное использование сборок, поскольку сгенерированный класс не сможет создать коллекцию.
Вы не можете использовать тип интерфейса в datacontract, потому что сериализатор не будет работать с свойствами типа интерфейса.
Вы можете использовать конкретный тип, например. MyClass [] или List
Помимо того, что вы не можете использовать типы интерфейсов, не важно, какой из типов коллекций вы используете. Клиент вашего сервиса никогда их не увидит.
Помните, что веб-службы предоставляют описание j услуги клиенту с точки зрения WSDL или mex. В случае WSDL клиент получит XML-схему, описывающую сообщения, которые должны быть отправлены и получены. В случае коллекции клиент просто увидит элемент с maxOccurs = "неограниченный" вместо одного с maxOccurs = "1". Клиент может интерпретировать это как массив или список или что-то еще. Независимо от того, какую коллекцию вы вернетесь из своей службы, клиент увидит maxOccurs = "неограниченный" и интерпретирует ее так, как ей нравится.
Исключение будет возвращать какой-то словарь, и я не знаю, как это работает.