44 votes

Utilisez-vous des types enum dans vos services web WCF ?

J'ai entendu certaines personnes dire que les enums sont diaboliques et ne devraient pas être utilisés dans les services web en raison des incompatibilités qui pourraient se produire entre le serveur et le client si certaines valeurs sont attribuées, ou si l'enum est marqué avec la balise Drapeaux attribut. Ils ont également déclaré que les services Web exposant des enums sont plus difficiles à maintenir, mais n'ont pas pu me donner d'arguments valables. Donc, d'après votre expérience, quels sont les avantages et les inconvénients de l'utilisation des enums dans un service Web WCF ?

43voto

MMind Points 1070

La raison pour laquelle les gens recommandent d'éviter les enums dans les webservices est qu'ils créent de subtils problèmes de rétrocompatibilité.

La même chose s'applique aux enums ordinaires, mais dans les services Web, le problème est encore plus évident, notamment dans les proxies générés par .NET (voir ci-dessous).

  • Si l'énumération est en entrée seulement, vous n'avez aucun problème.
  • Si l'énumération peut être un paramètre out, si vous ajoutez un nouvel élément et que vous le renvoyez, les anciens clients pourraient avoir des problèmes :
    • Si le client utilise un proxy généré par .NET, il s'interrompra avant que l'appelant ne puisse le gérer (lors de la désérialisation).
    • Même si le code généré pour le proxy prend en charge le changement (par exemple, s'il fait correspondre l'énumération à une chaîne), le code utilisateur dans le client peut ne pas traiter correctement la nouvelle valeur inattendue (il pourrait facilement s'agir d'un chemin jamais exécuté).

En définissant le paramètre comme une chaîne, vous signalez à l'utilisateur de votre API que la valeur peut changer à l'avenir. Même si vous pensez que la valeur ne changera jamais, il est bon d'être prêt.

Hay un bon poste par Dare Obasanjo sur ce sujet.

0 votes

Comme solution de rechange pour la rétrocompatibilité des enums, ils peuvent être déclarés comme [DataContract] et seules les anciennes valeurs peuvent être définies comme [DataMember], mais les nouvelles valeurs restent sans cet attribut.

0 votes

" Si l'énumération est en entrée seulement, vous n'avez aucun problème." Ce n'est pas tout à fait vrai : si vous renommez l'une des valeurs utilisées par un proxy généré par .NET, un ancien client vous envoyant l'ancien nom obtiendra une exception lorsque le serveur sera incapable de désérialiser la valeur.

18voto

khebbie Points 961

J'ai utilisé des enums dans WCF, également dans des scénarios d'interopérabilité. Si vous contrôlez les deux côtés du service, il est plus facile de travailler avec. Si vous ne contrôlez qu'un côté du service, vous devez faire attention aux problèmes que vous avez mentionnés.

Les Enums sont tellement mieux que les variables de type chaîne de caractères, ou que tout autre élément que vous pourriez choisir d'utiliser. L'utilisation de chaînes au lieu d'enums est un anti-modèle appelé "loosey Goosey" dans SOA.

10voto

Greg Beech Points 55270

Les énumérations sont entièrement prises en charge dans WSDL et XSD par l'intermédiaire de l'élément xsd:enumeration élément de schéma. Il prend en charge à la fois les valeurs uniques et les énumérations de type drapeau, où les valeurs multiples d'une énumération de drapeaux sont séparées par des espaces.

Vous ne devriez donc avoir aucun problème à utiliser les énumérations avec n'importe quelle plateforme conforme aux normes.

1 votes

La rétrocompatibilité mentionnée par MMind est une préoccupation sérieuse, qui est souvent négligée.

3voto

Maxime Rouiller Points 5987

Bien sûr, tout dépend de l'endroit où vous allez utiliser ce service WCF.

S'il s'agit d'une seule application qui l'utilisera, alors la modification du contrat n'aura aucun effet.

S'il s'agit de plusieurs applications internes, la modification du contrat peut nécessiter des changements dans les autres applications.

Et enfin, si le service WCF est public, il se peut que vous deviez fournir 2 versions différentes du service afin que les personnes qui les consomment aient le temps de transférer leur version du client vers le nouveau service.

Tout dépend de vos besoins, honnêtement.

2voto

Zackatoustra Points 11

Les Enums dans les WSDL doivent être considérés comme un problème de maintenance.

L'ajout ou la suppression d'une valeur d'énumération est (devrait être !) un déclencheur pour une mise à jour majeure de l'interface. Si l'énumération est une valeur de sortie, il faut nécessairement définir une nouvelle version du WSDL par le biais d'un nouvel URI, afin d'éviter que les clients actuels ne rompent le contrat établi ("que se passera-t-il s'ils reçoivent une de ces nouvelles valeurs inattendues en retour ?) Si l'énumération est une valeur d'entrée, vous pouvez considérer qu'il s'agit d'une mise à jour mineure ("puisque les clients actuels n'auront pas besoin de connaître cette nouvelle valeur"), mais alors, la seule façon pour ces clients de bénéficier de l'ajout de cette nouvelle option/fonctionnalité (vous avez ajouté cette nouvelle valeur d'énumération pour une raison, n'est-ce pas ?) serait de leur demander de passer, plus tard ou plus tôt, à la nouvelle version de l'interface.

Et cela n'a rien à voir avec la signification fonctionnelle de l'enum, je pense.

Restez du côté des meilleures pratiques, et vous serez en sécurité.

0 votes

Les Enums peuvent être déclarés en tant que [DataContract] et seules les anciennes valeurs peuvent être définies comme [DataMember], mais les nouvelles valeurs resteront sans attribut jusqu'à la nouvelle version MAJOR.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X