Лучший способ использовать List <T>и выставлять Collection <T> - PullRequest
8 голосов
/ 13 октября 2008

Я должен реализовать веб-сервис, который предоставляет список значений (целые числа, пользовательские классы и т. Д.). Мое рабочее решение возвращает List<T>, и в соответствии с FxCop лучше вернуть Collection<T> или ReadOnlyCollection<T>.

Если я решу вернуть ReadOnlyCollection<T>, веб-служба выдаст ошибку, такую ​​как:

Чтобы быть XML-сериализуемым, типы, наследуемые от ICollection, должны иметь реализацию Add(System.Int32) на всех уровнях своей иерархии наследования. System.Collections.ObjectModel.ReadOnlyCollection 1 [[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] не реализует Add(System.Int32).

Какой ваш любимый способ использовать List<T> для внутреннего использования и выставить Collection<T>? (с использованием C # и, предпочтительно, только фреймворка 2.0)

Ответы [ 2 ]

14 голосов
/ 13 октября 2008

Список или Коллекция подходят в этом случае.

С точки зрения исходного вопроса, вы можете поместить список в коллекцию очень просто:

List<Foo> list = new List<Foo>();
// ...
Collection<Foo> col = new Collection<Foo>(list);

Это настоящая обертка; добавить элемент в обертку (col), и он будет добавлен в список. Это может немного сбивать с толку, потому что многие такие конструкторы используют аргумент для начальной загрузки, но не ссылаются на исходный список. Коллекция является исключением; -p

Поскольку вы находитесь на границе веб-службы, эта рекомендация FxCop не применяется. Это полезно (в соответствии с недавним блогом Эрика Липперта ), чтобы предотвратить расторжение памяти вызывающим абонентом над памятью вызываемого абонента, но в сценарии с распределенными веб-сервисами, который просто не применяется. Фактически, поскольку у веб-сервисов есть несколько хорошо задокументированных проблем с определенными типичными сценариями, простой массив, вероятно, очень удобен и прагматичен на границе веб-сервиса. В контексте блога Эрика - в данном случае не возникает вопроса о проблеме звонящего / вызываемого абонента, поскольку между ними существует принудительный барьер.

С точки зрения WSDL / mex, я подозреваю, что все 3 (список / коллекция / массив) просто станут блоком элементов - так что вы можете хорошо использовать тот, который удобнее.

1 голос
/ 13 октября 2008

Обычно я возвращаю IList из веб-службы WCF: FxCop достаточно доволен этим. Не уверен, что это работает с веб-сервисами ASMX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...