Question

Je dois implémenter un service Web qui expose une liste de valeurs (entiers, classes personnalisées, etc.). Ma solution de travail renvoie une liste < T > et, selon FxCop, il est préférable de renvoyer un Collection < T > ou ReadOnlyCollection < T / gt; . .

Si je choisis de renvoyer un ReadOnlyCollection < T > , le service Web affiche une erreur telle que:

  

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

Quelle est votre manière préférée d'utiliser en interne une liste < T > et d'exposer une collection < T > ? (en utilisant C # et, de préférence, le framework 2.0 uniquement)

Était-ce utile?

La solution

Liste < T > ou Collection < T > sont bien dans ce cas.

En termes de question initiale, vous pouvez encapsuler 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 vrai wrapper; ajoutez un élément au wrapper (col) et il sera ajouté à la liste. Cela peut être légèrement déroutant, car de nombreux constructeurs utilisent l'argument pour effectuer la population initiale, mais ne créent pas de lien vers la liste d'origine. Collection < T > est une exception ;-p

Étant donné que vous êtes sur une limite de service Web, la recommandation de FxCop ne s'applique pas. C'est utile (en ligne avec Récente de Eric Lippert blog ) pour empêcher un appelant de piétiner la mémoire de l'appelé - mais dans un scénario de service Web distribué qui ne s'applique tout simplement pas. En fait, étant donné que les services Web présentent quelques problèmes bien documentés avec certains scénarios génériques, un tableau simple est sans doute très utilisable et pragmatique au niveau d’une frontière de services Web. Dans le contexte du blog d'Eric - dans ce cas, il n'est pas question du problème des appelants / appelés, puisqu'il existe une barrière forcée entre les deux.

En termes de WSDL / mex, je soupçonne que les 3 (liste / collection / tableau) deviendront simplement un bloc d’éléments - vous pourrez donc vous en servir à votre guise.

Autres conseils

Je retourne généralement IList < T > depuis un service Web WCF: FxCop est assez satisfait de cela. Vous ne savez pas si cela fonctionne avec les services Web ASMX.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top