Domanda

Il mio dilemma è, fondamentalmente, come condividere un'enumerazione tra due applicazioni.

Gli utenti caricano i documenti tramite un'applicazione front-end disponibile sul web.Questa applicazione chiama un servizio Web dell'applicazione back-end e gli passa il documento.L'app back-end salva il documento e inserisce una riga nel file Documento tavolo.

Il tipo di documento (7 possibili tipi di documento: Fattura, Contrarre ecc.) viene passato come parametro al servizio web Carica documento metodo.La domanda è: quale dovrebbe essere il tipo (e i possibili valori) di questo parametro?

Poiché è necessario codificare questi valori in entrambe le applicazioni, penso che sia O.K.per utilizzare una stringa descrittiva (Fattura, Contrarre, Ordine di lavoro, Ordine di lavoro firmato).

Forse è un approccio migliore per creare un file DocumentTypes enumerazione nella prima applicazione, e riprodurla anche nella seconda applicazione, per poi passare tra loro il valore intero corrispondente al servizio web?

È stato utile?

Soluzione

Posso parlare solo di .net, ma se disponi di un servizio Web ASP.net, dovresti essere in grado di aggiungervi un'enumerazione direttamente.

Quando quindi utilizzi "Aggiungi riferimento Web" nell'applicazione client, la classe risultante dovrebbe includere tale enum

Ma questo viene dal cima della mia testa, sono abbastanza sicuro di averlo fatto in passato, ma non posso dirlo con certezza.

Altri suggerimenti

Suggerirei di non passare un numero intero tra di loro, semplicemente per motivi di leggibilità e debug.Supponiamo che stai esaminando i tuoi registri e vedi un mucchio di 500 errori per DocumentType=4.Ora devi cercare quale DocumentType è 4.Oppure se una delle applicazioni fa riferimento a un numero che non esiste nell'altra, magari a causa di versioni non corrispondenti.

È un po' più di codice e irrita un po' la parte statica del cervello che digita, ma nei protocolli su HTTP la saggezza diffusa è quella di affiancare stringhe leggibili rispetto a enumerazioni opache.

Utilizzerei comunque l'enumerazione internamente, ma mi aspetterei che i consumatori mi passino solo il nome, non il valore numerico stesso.

solo qualche stupido esempio per illustrare:

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

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

In .NET, i valori di enumerazione vengono (per impostazione predefinita) serializzati in XML con il nome.Per i casi in cui è possibile avere più valori (bandiere), quindi inserisce uno spazio tra i valori.Funziona perché l'enumerazione non contiene spazi, quindi puoi ottenere nuovamente il valore dividendo la stringa (es."Invoice Contract SignedWorkOrder", utilizzando l'esempio di Lubos).

È possibile controllare la serializzazione dei valori dei servizi Web asp.net utilizzando il file XmlEnumAttribute, o utilizzando il file EnumMember attributo quando si utilizza WCF.

Se stai utilizzando il servizio Web da una pagina/applicazione .NET, dovresti essere in grado di accedere all'enumerazione dopo aver aggiunto il riferimento Web al progetto che sta utilizzando il servizio.

Se non si utilizza da .NET a .NET SOAP, è comunque possibile definire un enumeratore purché entrambi gli endpoint utilizzino 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>

Spetta allo strumento WSDL -> Generatore proxy analizzarlo in un'enumerazione equivalente nella lingua del client.

Ci sono alcuni buoni motivi per non utilizzarlo enumè su un confine di interfaccia del genere.Prendere in considerazione Il post di Dare a questo proposito.

Ho notato che quando si utilizza "Aggiungi riferimento al servizio" anziché "Aggiungi riferimento Web" da VS.net, i valori di enumerazione effettivi vengono visualizzati così come i nomi di enumerazione.Questo è davvero fastidioso perché devo supportare sia i client 2.0 che 3.5.Alla fine devo accedere al codice proxy del servizio Web generato 2.0 e aggiungere manualmente i valori enum ogni volta che apporto una modifica!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top