Desenvolvimento - C#

Compartilhando tipos entre o serviço e o cliente

Uma questão que sempre é levantada quando falamos de contratos de serviços WCF, refere-se ao compartilhamento dos tipos que são expostos pelo documento WSDL.

por Israel Aéce



Uma questão que sempre é levantada quando falamos de contratos de serviços WCF, refere-se ao compartilhamento dos tipos que são expostos pelo documento WSDL. Pararetornar e/ou receber uma instancia de uma classe customizada, basta referenciarmos este tipo em um contrato que, automaticamente, ele já será embutido no documento WSDL. Com isso, ao referenciar o serviço no cliente, uma representação desta classe será criada para que seja possível enviar e/ou receber uma instancia deste objeto complexo.

Durante a referencia (independentemente de qual artefato é utilizado pararealizá-la (através da IDE ou utilitário svcutil.exe)), ele olhará para o projeto onde o serviço está sendo referenciado, para determinar se o tipo que o serviço expõe/retorna já existe dentro do mesmo. Caso ele não exista, automaticamente uma classe será criada para representá-la que, obviamente, será baseada no documento WSDL. Essa técnica fornece um baixo acoplamento, assim como já era o caso dos ASP.NET Web Services (ASMX).

Como sabemos, a serialização apenas persiste o estado de um objeto. Isso quer dizer que possíveis métodos e/ou atributos especiais não são propagados através deste processo. Há casos em que se quer compartilhar não somente o estado de um objeto, mas também outras funcionalidades que o mesmo forneça, e que está além das capacidades do processo deserialização.

É neste cenário que o compartilhamento de tipos entra em cena. Isso deve mudar ligeiramente a estrutura das aplicações, ou seja, o tipo a ser compartilhado entre o serviço e o cliente deverá ser isolado em um Assembly (DLL), referenciado pelas duas aplicações. O contrato do serviço agora passará a receber e enviar instancias da classe que está neste Assembly compartilhado e com isso, ao invés de criar uma nova classe para representar o objeto, a IDE (ou o utilitáriosvcutil.exe) irá fazer o uso deste tipo que, além do estado das propriedades que foram fornecidas pelo serviço, temos todas as possíveis funcionalidades que este objeto fornece. Ao contrário do que vimos acima, esta técnica traz um forte acoplamento entre os envolvidos, bem como já acontecia com o .NET Remoting, obrigando as "duas pontas" serem WCF.

A vantagem do compartilhamento é que a cada nova mudança no contrato, ou melhor, nas propriedades do objeto, não há necessidade de atualizar a referencia do serviço para que ele sincronize o objeto local com o objeto exposto pelo documento WSDL. Se todos os projetos estão dentro da mesma solução, basta uma simples compilação e tudo já estará funcionando. Esse comportamento melhora consideravelmente a produtividade e convenienciadurante o desenvolvimento do serviço e do cliente, enquanto o ponto negativo gira em torno da interoperabilidade e do acoplamento que se tem entre os participantes.
Israel Aéce

Israel Aéce - Especialista em tecnologias de desenvolvimento Microsoft, atua como desenvolvedor de aplicações para o mercado financeiro utilizando a plataforma .NET. Como instrutor Microsoft, leciona sobre o desenvolvimento de aplicações .NET. É palestrante em diversos eventos Microsoft no Brasil e autor de diversos artigos que podem ser lidos a partir de seu site http://www.israelaece.com/. Possui as seguintes credenciais: MVP (Connected System Developer), MCP, MCAD, MCTS (Web, Windows, Distributed, ASP.NET 3.5, ADO.NET 3.5, Windows Forms 3.5 e WCF), MCPD (Web, Windows, Enterprise, ASP.NET 3.5 e Windows 3.5) e MCT.