Pergunta

Meu dilema é, basicamente, como compartilhar uma enumeração entre duas aplicações.

Os usuários fazem upload de documentos por meio de um aplicativo front-end que está na web.Este aplicativo chama um serviço web do aplicativo back-end e passa o documento para ele.O aplicativo back-end salva o documento e insere uma linha no Documento mesa.

O tipo de documento (7 tipos de documentos possíveis: Fatura, Contrato etc.) é passado como parâmetro para o web service Carregar Documento método.A questão é: qual deve ser o tipo (e possíveis valores) deste parâmetro?

Como você precisa codificar esses valores em ambos os aplicativos, acho que está tudo bem.para usar uma string descritiva (Fatura, Contrato, Ordem de serviço, Ordem de trabalho assinada).

Será talvez uma abordagem melhor para criar um Tipos de documentos enumeração na primeira aplicação, e reproduzi-la também na segunda aplicação, e então passar o valor inteiro correspondente para o serviço web entre eles?

Foi útil?

Solução

Só posso falar sobre .net, mas se você tiver um Webservice ASP.net, poderá adicionar uma enumeração diretamente a ele.

Quando você usa "Adicionar referência da Web" em seu aplicativo cliente, a classe resultante deve incluir esse enum

Mas isso vem da minha cabeça, tenho quase certeza de que já fiz isso no passado, mas não posso dizer com certeza.

Outras dicas

Eu sugiro não passar um número inteiro entre eles, simplesmente para fins de legibilidade e depuração.Digamos que você esteja examinando seus logs e veja vários 500 erros para DocumentType=4.Agora você precisa procurar qual DocumentType é 4.Ou se um dos aplicativos se refere a um número que não existe no outro, talvez por versões incompatíveis.

É um pouco mais de código e irrita um pouco a parte de digitação estática do cérebro, mas em protocolos sobre HTTP a sabedoria recebida é ficar do lado de strings legíveis em vez de enumerações opacas.

Eu ainda usaria a enumeração internamente, mas esperaria que os consumidores me passassem apenas o nome, não o valor numérico em si.

apenas um exemplo bobo para ilustrar:

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

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

No .NET, os valores de enumeração são (por padrão) serializados em xml com o nome.Para casos em que você pode ter vários valores (bandeiras), então ele coloca um espaço entre os valores.Isso funciona porque a enumeração não contém espaços, então você pode obter o valor novamente dividindo a string (ou seja,"Contrato de Fatura AssinadoWorkOrder", usando o exemplo de lubos).

Você pode controlar a serialização de valores em serviços da web asp.net usando o XmlEnumAttribute, ou usando o EnumMember atributo ao usar o WCF.

Se você estiver consumindo seu serviço Web a partir de uma página/aplicativo .NET, poderá acessar a enumeração depois de adicionar sua referência Web ao projeto que está consumindo o serviço.

Se você não estiver trabalhando com .NET para .NET SOAP, ainda poderá definir um enumerador, desde que ambos os pontos de extremidade estejam usando 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>

Cabe à ferramenta geradora de proxy WSDL -> analisar isso em um enum equivalente na linguagem do cliente.

Existem algumas boas razões para não usar enums em um limite de interface como esse.Considerar Postagem de Dare sobre o assunto.

Percebi que ao usar "Adicionar referência de serviço" em vez de "Adicionar referência da Web" do VS.net, os valores reais da enumeração aparecem, assim como os nomes da enumeração.Isso é realmente irritante porque preciso oferecer suporte a clientes 2.0 e 3.5.Acabo tendo que entrar no código proxy do serviço da web gerado 2.0 e adicionar manualmente os valores enum sempre que faço uma alteração!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top