2008-10-13 10 views
8

Je dois implémenter un service Web qui expose une liste de valeurs (entiers, classes personnalisées, etc.). Ma solution de travail renvoie un List<T>, et selon FxCop il est préférable de retourner un Collection<T> ou ReadOnlyCollection<T>.Meilleure façon d'utiliser la liste <T> et d'exposer Collection <T>

Si je choisis de retourner un ReadOnlyCollection<T>, le service Web affiche une erreur comme:

Pour être sérialisable XML, les types qui héritent de ICollection doivent avoir une mise en œuvre de Add(System.Int32) à tous les niveaux de leur hiérarchie d'héritage. System.Collections.ObjectModel.ReadOnlyCollection1[[System.Int32, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] n'implémente pas Add(System.Int32).

Quelle est votre méthode préférée pour utiliser en interne un List<T> et exposer un Collection<T>? (en utilisant C#, et de préférence le framework 2.0 uniquement)

Répondre

14

La liste < T> ou la collection <T> sont bien dans ce cas.

En termes de la question initiale, vous pouvez envelopper une liste <T> dans une collection <T> très simplement:

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

Ceci est un véritable emballage; ajouter un élément à l'encapsuleur (col), et il est ajouté à la liste. Cela peut être légèrement déroutant, car beaucoup de ces constructeurs utilisent l'argument pour faire la population initiale, mais ne lient pas à la liste originale. Collection <T> est une exception ;-p

Étant donné que vous êtes sur une frontière de service Web, cette recommandation de FxCop ne s'applique pas. Cela est utile (en ligne avec Eric Lippert's recent blog) pour empêcher un appelant de piétiner la mémoire de l'appelé - mais dans un scénario distribué par le service Web qui ne s'applique tout simplement pas. En fait, étant donné que les services Web ont quelques problèmes bien documentés avec certains scénarios génériques, un simple tableau est sans doute très utilisable et pragmatique à la frontière d'un service Web. Dans le contexte du blog d'Eric - dans ce cas, il n'est pas question de la question de l'appelant/appelé, puisqu'il y a une barrière forcée entre les deux. En termes de WSDL/mex, je soupçonne que tous les 3 (list/collection/array) deviendront simplement un bloc d'éléments - donc vous pouvez aller bien avec ce qui est le plus pratique.

+0

Merci pour votre réponse et pour les détails sur la collection agissant comme un véritable emballage, je n'ai rien trouvé à ce sujet avant. – alexandrul

1

Je retourne généralement IList <T> à partir d'un service Web WCF: FxCop est assez heureux avec cela. Vous ne savez pas si cela fonctionne avec les services Web ASMX.

+0

Les services Web ASMX ne sérialiseront pas (et fourniront une exception d'exécution). –

Questions connexes