WCF Tips–Bounded Generics, Serialization e o Data Contract

Services & SOA & WCF

contract_genericEssa é uma dica que eu acho importante compartilhar. Ultimamente por conta de uma necessidade acabei topando com algumas reclamações em relação ao uso de Generics em contatos de dados no WCF, o que me motivou a escrever este post abordando o uso e também o motivo desta implementação no Windows Communication Foundation.

É comum que um desenvolvedor .NET trabalhar com generics. Sendo assim, ao iniciar no WCF também será comum que ele mantenha a mesma mentalidade, criado novos tipos e métodos genéricos. O problema disso é que WCF não suporta a exposição de tipos genéricos!

A primeira informação crucial aqui é que isso não é culpa ou limitação do WCF :D

O que leva então a este tipo de implementação no WCF? Como sabemos o WCF segue os padrões definidos no Web Services Specifications. Sendo assim, nossa limitação ocorre por conta do WSDL (Web Services Description Language), um padrão definido pela W3C para especificar as atividades a serem realizadas pelo serviço, que em nosso caso é utilizado para expor os metadados do serviço aos consumidores.

Não existe nenhuma construção dentro do WSDL para definir um tipo genérico, o que faz sentido, já que este tipo de implementação diminui o acoplamento entre cliente e serviço. Generics são específicos do .NET e seu uso na exposição dos serviços viola a natureza Orientada a Serviços no qual o WCF se baseia.

O Windows Communication Foundation usa um mecanismo de serialização no contrato de dados para serializar ou desserializar dados, e isso funciona bem para todos os tipos primitivos de .NET Framework , como Int e String. Para tipos complexos você deve definir um contrato de dado para que o mesmo seja serializável. Você pode ter uma visão melhor sobre tipos com suporte neste link: Tipos com suporte pelo serializador do contrato de dados

Mesmo assim podemos trabalhar com objetos genéricos no WCF, chamados neste caso de Bounded Generics. Vamos ao exemplo ):

wcfbounded01

Basicamente, temos uma classe genérica para o Data Contract que fica restrito ao tipo que será utilizado na operação do serviço. Observe o código abaixo:

wcfbounded02

Note que o objeto que é exposto é o genérico ObjetoGenerico<T>, porém em nosso Operation Contract existe a restrição aos tipos int e string. Isso é o Bounded Generic, ou traduzindo Genérico Delimitado.

Eis aqui o motivo em dizer que não há suporte para o generics em relação a sua exposição no serviço. Mesmo realizando a implementação acima, o cliente não vai saber nada sobre isso. Como a "delimitação" aponta para um dos tipos base, os metadados gerados vão descrever a operação do serviço, contrato de dados e tudo mais como uma classe padrão.

Observe a implementação do serviço:

wcfbounded03

Agora vamos ao cliente. Observe o código abaixo:

wcfbounded04

Criei uma console application para consumir as operações expostas no serviço. A primeira coisa que quero chamar atenção é no tipo gerado para o ObjetoGenerico, no caso, as duas linhas com o traço amarelo em destaque.

Note que foi gerado um nome com o seguinte padrão: Generic Class Name + "Of" + Type Parameter Name, gerando os seguintes nomes:

  • ObjetoGenericoOfstring
  • ObjetoGenericoOfint

Observando as classes geradas podemos notar que os métodos são assinados com os tipos base String e Int, ou seja, não existe nada de diferente da perspectiva do cliente. Observe o retorno da execução de nosso serviço:

wcfbounded05

 

Voltando a minha afirmação de que o WCF não suporta a exposição de tipos genéricos. Você vai encontrar várias referências falando que é possível a exposição de genéricos porém com algumas limitações. Ao meu ponto de ver isso é errado. Como já citei esta é uma estrutura que não existe no WSDL, logo é um implementação local e particular do .NET que assume um comportamento padrão do lado do cliente.

Embora possamos usar generics na construção de nossos serviços, sua exposição será sempre a padrão, utilizando os tipos específicos.

 

O CÓDIGO FONTE PODE SER BAIXADO AQUI!!!

 

Referências

Introduction to WSDL

Windows Communication Foundation

Programming WCF Services

 

Bons estudos e até a próxima pessoal  ;)


Author's profile picture

Vitor is a computer scientist who is passionate about creating software that will positively change the world we live in.

MVP Azure - Cloud Architect - Data science enthusiast


4 minutes to read