Question

J'ai un service Web WCF qui a une méthode qui retourne une collection générique. Maintenant, ma question est: Dois-je exposer comme ICollection<T>, List<T>, IList<T>, IEnumerable<T> ou autre chose?

Je suppose que List<T> est hors de question que je veux éviter erreurs CA1002 , mais le type sous-jacent sera List<T>.

Je suis vraiment intéressé à entendre vos prises à ce sujet, de préférence avec une bonne explication des raisons pour lesquelles vous pensez ce que vous pensez.

Merci d'avance

Était-ce utile?

La solution

Gardez à l'esprit que des erreurs telles que CA1002 sont vraiment destinés à appliquer aux bibliothèques. Un service WCF n'est pas une bibliothèque, il est un point final qui est tout sérialisation sur SOAP, REST, etc.

Vous trouverez que si vous essayez d'exposer une interface telle que ICollection<T> ou IList<T>, vous obtiendrez des erreurs que le type ne peut pas être sérialisé. En fait, List<T> est probablement le meilleur choix ici. Lorsqu'un proxy est généré sur le côté client, il finit comme un tableau par défaut, et beaucoup, sinon la plupart des gens changent à un List<T>, de sorte que 90% du temps, peu importe comment vous choisissez de l'exposer, c'est le type que le client va voir de toute façon.

Je note qu'il est généralement préférable de ne pas « retour » une collection du tout d'une opération de WCF ou un service Web en général. Il est plus fréquent de créer une classe proxy qui contient la collection que vous voulez, et le retour qui, i.e..

[OperationContract]
OrdersResult GetOrders(OrderRequest request);

Lorsque la classe proxy pourrait ressembler à ceci:

[DataContract]
public class OrdersResult
{
    [DataMember]
    public List<Order> Orders { get; set; }
}

De cette façon, si vous décidez besoin d'ajouter plus de données à la demande ou de la réponse, vous pouvez le faire sans causer la rupture des changements au client.


Addendum: La vraie question ici avec WCF est que WCF ne sait pas qu'un type particulier est utilisé uniquement pour les données sortantes Quand une classe est exposée à travers un service de WCF, WCF suppose que. peut faire partie soit demande ou réponse , et si elle fait partie d'un demande , le type doit être concret et ne peut pas être immuable . C'est la raison de toutes les autres restrictions stupides comme nécessitant setters de propriété.

Vous avez pas le choix ici, mais d'utiliser un béton, le type de collection mutable, et dans la plupart des cas cela signifie soit un tableau ou une liste générique.

Autres conseils

À mon avis, le service et les contrats données qui exposent les séquences doivent indiquer clairement que les séquences sont immuables , car ils voyagent sur le fil comme DTO . Il ne fait pas beaucoup de sens ajout et la suppression d'une séquence que vous avez reçu un niveau différent. Au contraire, vous voulez lire que les données et faire quelque chose avec elle.

Étant donné que, je préférerais vraiment utiliser IEnumerable<T>, mais malheureusement, cela ne fonctionne tout simplement pas bien avec WCF. Vous pouvez obtenir toutes sortes d'erreurs étranges, en particulier en ce qui concerne l'exécution différée, donc (dans un contexte de WCF) il est préférable de rester à l'écart de ceux-ci.

Ce vraiment que des feuilles tableaux , car ils communiquent l'intention des meilleures options restantes.

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