Pergunta

Ainda sou novo no mundo ASP.NET, então posso estar errado aqui, mas até agora isso é de acordo com meu conhecimento (limitado)!

Digamos que eu tenha um business object padrão "Contato" no Negócios espaço para nome.Eu escrevo um serviço Web para recuperar as informações de um contato de um banco de dados e retorná-las.Em seguida, escrevo um aplicativo cliente para solicitar esses detalhes.

Agora, eu também crio um método utilitário que pega um "Contato" e faz alguma mágica com ele, como Utils.BuyContactNewHat() dizer.O que, claro, leva o tipo Contact Business.Contact.

Em seguida, volto para meu aplicativo cliente e quero utilizar o BuyContactNewHat método, então adiciono uma referência ao meu Útil espaço para nome e aí está.No entanto, surge um problema com:

Contact c = MyWebService.GetContact("Rob);
Utils.BuyContactNewHat(c); // << Error Here

Como o tipo de retorno de GetContact é de MyWebService.Contact e não Business.Contact como esperado.Entendo por que isso ocorre porque, ao acessar um serviço da Web, você está na verdade programando na classe de proxy gerada pelo WSDL.

Então, existe uma maneira “mais fácil” de lidar com esse tipo de incompatibilidade?Eu estava pensando em tentar criar uma classe conversora genérica que usasse reflexão para garantir que dois objetos tivessem a mesma estrutura, em vez de simplesmente transferir os valores de um para outro.

Foi útil?

Solução

Você está no caminho certo.Para obter os dados do objeto proxy de volta para um de seus próprios objetos, você precisa executar o código da esquerda para a direita.ou sejacopiar valores de propriedade.Aposto que já existe um método genérico que usa reflexão.

Algumas pessoas usarão algo diferente de um serviço da Web (remoting .net) se quiserem apenas transmitir um objeto de negócios.Ou eles usarão serialização binária.Suponho que você esteja usando o serviço da web por um motivo, então terá que fazer a cópia de propriedades.

Outras dicas

Na verdade, você não precisa usar a classe gerada fornecida pelo WSDL.Se você der uma olhada no código que ele gera, verá que ele está apenas fazendo chamadas para algumas classes do .NET framework para enviar solicitações SOAP.No passado, copiei esse código em um arquivo .cs normal e editei-o.Embora eu não tenha tentado isso especificamente, não vejo razão para que você não possa descartar a definição da classe proxy e usar a classe original para receber os resultados da chamada SOAP.Já deve estar refletindo por baixo do capô, parece uma pena fazer isso duas vezes.

Eu recomendaria que você escrevesse uma extensão de importador de esquema, que pode ser usada para controlar a geração de código proxy.Essa abordagem pode ser usada para (elegantemente) resolver seu problema sem complicações (como copiar objetos de um namespace para outro ou modificar a classe reference.cs gerada pelo proxy apenas para substituí-la na próxima vez que você atualizar a referência da web).

Aqui está um tutorial (muito) bom sobre o assunto:

http://www.microsoft.com/belux/msdn/nl/community/columns/jdruyts/wsproxy.mspx

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