Question

Mon dilemme est essentiellement de savoir comment partager une énumération entre deux applications.

Les utilisateurs téléchargent des documents via une application frontale située sur le Web.Cette application appelle un service Web de l'application back-end et lui transmet le document.L'application back-end enregistre le document et insère une ligne dans le Document tableau.

Le type de document (7 types de documents possibles : Facture, Contracter etc.) est passé en paramètre au service Web Télécharger le document méthode.La question est de savoir quel doit être le type (et les valeurs possibles) de ce paramètre ?

Puisque vous devez coder en dur ces valeurs dans les deux applications, je pense que c'est OK.pour utiliser une chaîne descriptive (Facture, Contracter, Demande de service, Ordre de travail signé).

Est-ce peut-être une meilleure approche de créer un Types de documents énumération dans la première application, et la reproduire également dans la deuxième application, puis transmettre la valeur entière correspondante au service web entre eux ?

Était-ce utile?

La solution

Je ne peux parler que de .net, mais si vous disposez d'un Webservice ASP.net, vous devriez pouvoir y ajouter directement une énumération.

Lorsque vous utilisez ensuite « Ajouter une référence Web » dans votre application client, la classe résultante doit inclure cette énumération

Mais cela vient du haut de ma tête, je suis presque sûr de l'avoir fait dans le passé, mais je ne peux pas le dire avec certitude.

Autres conseils

Je déconseille de passer un entier entre eux, simplement à des fins de lisibilité et de débogage.Supposons que vous parcouriez vos journaux et que vous voyiez un tas de 500 erreurs pour DocumentType=4.Maintenant, vous devez chercher quel DocumentType est 4.Ou si l'une des applications fait référence à un numéro qui n'existe pas dans l'autre, peut-être en raison de versions incompatibles.

C'est un peu plus de code, et cela frotte un peu la partie de frappe statique du cerveau, mais dans les protocoles au-dessus de HTTP, la sagesse reçue est de se ranger du côté des chaînes lisibles plutôt que des énumérations opaques.

J'utiliserais toujours l'énumération en interne, mais je m'attendrais à ce que les consommateurs me transmettent uniquement le nom, pas la valeur numérique elle-même.

juste un exemple idiot pour illustrer :

public enum DocumentType
{
  Invoice,
  Contract,
  WorkOrder,
  SignedWorkOrder
}

[WebMethod]
public void UploadDocument(string type, byte[] data)
{
  DocumentType docType = (DocumentType)Enum.Parse(typeof(DocumentType), type);
}

Dans .NET, les valeurs d'énumération sont (par défaut) sérialisées en XML avec le nom.Pour les cas où vous pouvez avoir plusieurs valeurs (drapeaux), puis il met un espace entre les valeurs.Cela fonctionne car l'énumération ne contient pas d'espaces, vous pouvez donc récupérer la valeur en divisant la chaîne (c'est-à-dire."Invoice Contract SignedWorkOrder", en utilisant l'exemple de Lubos).

Vous pouvez contrôler la sérialisation des valeurs des services Web asp.net à l'aide de l'outil XmlEnumAttribute, ou en utilisant le EnumMembre attribut lors de l’utilisation de WCF.

Si vous consommez votre service Web à partir d'une page/application .NET, vous devriez pouvoir accéder à l'énumération après avoir ajouté votre référence Web au projet qui consomme le service.

Si vous n'utilisez pas .NET vers .NET SOAP, vous pouvez toujours définir un énumérateur à condition que les deux points de terminaison utilisent WSDL.

<s:simpleType name="MyEnum">    
     <s:restriction base="s:string">
          <s:enumeration value="Wow"/>
          <s:enumeration value="This"/>
          <s:enumeration value="Is"/>
          <s:enumeration value="Really"/>
          <s:enumeration value="Simple"/>
     </s:restriction>
</s:simpleType>

C'est à l'outil générateur WSDL -> Proxy d'analyser cela en un équivalent enum dans le langage client.

Il existe de très bonnes raisons de ne pas utiliser enums sur une limite d'interface comme celle-là.Considérer Le message d'Osez sur le sujet.

J'ai remarqué que lors de l'utilisation de "Ajouter une référence de service" par opposition à "Ajouter une référence Web" de VS.net, les valeurs d'énumération réelles apparaissent ainsi que les noms d'énumération.C'est vraiment ennuyeux car je dois prendre en charge les clients 2.0 et 3.5.Je finis par devoir accéder au code proxy du service Web généré par 2.0 et ajouter manuellement les valeurs d'énumération à chaque fois que j'apporte une modification !

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