Вы находитесь на странице: 1из 3

Israel Aece | Reutilizando tipos entre servios

Page 1 of 3

I s ra e l A e c e
Microsoft MVP, MCP, MCAD, MCTS, MCPD e MCT Pgina inicial Arquivo Contato Se inscrever Log in Filter by APML << WCF Web API - Consumo de Servios | Overview do Windows Identity Foundation >>

Sobre
Meu nome Israel Aece e sou especialista em tecnologias de desenvolvimento Microsoft, atuando como desenvolvedor de aplicaes para o mercado financeiro utilizando a plataforma .NET. [ Mais ]

Reutilizando tipos entre servios


By Israel Aece 19. abril 2011 21:50

Ao consumir um servio SOAP, geralmente utilizamos o documento WSDL para montar todos os artefatos necessrios para efetuar a comunicao com o servio, que executado remotamente. Esse documento traz todas as funcionalidades expostas por aquele servio, diretivas de como essa comunio deve ser realizada, e ainda, informaes que descrevem eventuais objetos complexos que fazem parte do contrato. Em um cenrio especfico, podemos criar mais de um servio que recebe ou expe uma mesma classe. Essa classe criada do lado do servio, e este tipo pode ser utilizado por qualquer servio que consiga acess-la. Subindo estes dois servios, ambos podem tambm ser referenciados em um mesmo cliente, e quando utilizamos o Visual Studio, ele faz o download do WSDL, constri proxy e remonta todos os tipos deste lado, para que o cliente possa envi-los e/ou receb-los, conseguindo assim reconstruir os objetos no cliente, trabalhando de forma tipada. S que quando temos esse cenrio, podemos nos deparar com um detalhe no cliente que pode parecer confuso em um primeiro momento. Para exemplificarmos, repare no simples cdigo que temos abaixo. H uma classe chamada Usuario com apenas uma propriedade. Temos dois contratos, onde cada um est implementado em um servio diferente, e tudo o que as operaes destes contratos fazem, enviar e receber a instncia da classe Usuario. public class Usuario { public string Nome { get; set; } } [ServiceContract] public interface IContrato1 { [OperationContract] Usuario Metodo1(Usuario usuario); } public class Servico1 : IContrato1 { public Usuario Metodo1(Usuario usuario) { } } [ServiceContract] public interface IContrato2 { [OperationContract] Usuario Metodo2(Usuario usuario); } public class Servico2 : IContrato2 { public Usuario Metodo2(Usuario usuario) { } } Aqui foi omitido, mas temos o cdigo que expe estes dois servios atravs do protocolo HTTP, utilizando o binding BasicHttpBinding. Em primeiro lugar, referenciamos na aplicao cliente o Servico1. Isso faz com que o Visual Studio crie o tipo Usuario no cliente. Depois disso, decidimos referenciar o Servico2 tambm neste mesmo cliente, que como sabemos, tambm utiliza a classe Usuario. Ao fazer isso, o Visual Studio acaba recriando o tipo Usuario, mas agora para atender o segundo servio. Apesar de que do lado do servidor ambos servios utilizam o mesmo tipo, ao referenciar no cliente, o Visual Studio no tem poder de identificar isso e, consequentemente, acaba sendo criado duas classes Usuario, onde cada um atende um servio especfico, e elas no podem ser compartilhadas, ou melhor, utilizar uma delas no lugar da outra. A imagem abaixo ilustra isso essa separao:

Digite algo para buscar

Buscar

c d e f g Incluir comentrios na busca

Categorias
.NET Framework (164) ASP.NET (236) Async (33) C# (29) CSD (103) Data (69) General (44) Interoperabilidade (15) Security (100) VB.NET (27) WCF (219) WIF (18) WPF (8)

Tags
Arquitetura Assembly Autenticao Autorizao Behavior Binding
Caching Callbacks Cas Certificates Collections Com+

Code

Configurao Contract

Debug

Deployment Encoding Entity

Framework

Globalization Hosting

Estensibilidade Exception Http Ide Identity Iis

Internals Io Json Linq Messagequeue Mvc


Oop Partial Trust

Performance

Rest Serializao Silverlight Smtp Sql Server Sqlclr Talks Tcp Threading Tools
Provider Proxy Reflection Transactions

Ui

Videos Windows Services

Ws-* Wsdl Xml

Histrico
2011 Julho (2) Junho (1) Maio (5) Abril (7) Maro (7) Fevereiro (4) Janeiro (4) 2010 2009 2008 2007

http://www.israelaece.com/post/Reutilizando-tipos-entre-servicos.aspx

18/7/2011

Israel Aece | Reutilizando tipos entre servios

Page 2 of 3

2006 2005 2004 2003

Host

Para certificar da independncia entre as classes Usuario dos servicos, podemos visualizar o cdigo abaixo, que uma verso resumida do que gerado do lado do cliente para ambos os servios referenciados. Para cada um dos deles, temos um namespace distinto, e debaixo destes, uma classe Usuario para cada. Mais adiante, podemos perceber que no interior de cada um dos mtodos, eles referenciam a respectiva classe Usuario que est dentro de seu prprio namespace. namespace Cliente.Servico1 { public partial class Usuario { } public interface IContrato1 { Cliente.Servico1.Usuario Metodo1(Cliente.Servico1.Usuario usuario); } public partial class Contrato1Client { public Cliente.Servico1.Usuario Metodo1(Cliente.Servico1.Usuario usuario) { } } } namespace Cliente.Servico2 { public partial class Usuario { } public interface IContrato2 { Cliente.Servico2.Usuario Metodo2(Cliente.Servico2.Usuario usuario); } public partial class Contrato2Client { public Cliente.Servico2.Usuario Metodo2(Cliente.Servico2.Usuario usuario) { } } } O que vimos acima, o suficiente para proibir que se use uma mesma classe Usuario para ambos os servios. E, para que isso seja possvel, temos algumas alternativas. A primeira delas seria, depois de referenciado ambos os servios, elegermos uma das classes Usuario e lev-la para um local centralizado, talvez em um outra namespace, e depois disso, alterar os locais em que elas esto sendo referenciadas, e apontar para esta "nova" classe/local. Uma outra opo que temos, que acredito ser at mais elegante, seria recorrer ao utilitrio svcutil.exe, e gerar todos os recursos necessrios para consumir um dos servios. Depois das classes criadas, voc deve criar um projeto do tipo Class Library, e colocar essas classes que foram geradas dentro dele. Com isso, voc compila o projeto e gera uma DLL contendo o proxy e a classe Usuario. De posse desta DLL, voc referencia na aplicao cliente que deve utilizar este servio. Abaixo temos a linha de comando que gera as classes para o primeiro servico: C:\>svcutil http://localhost:8888 Depois da DLL referenciada, podemos agora adicionar a referncia para o segundo servio no prprio Visual Studio, que por padro, ele capaz, de antes de gerar os tipos que o servio disponibiliza, analisar se esse tipo j existe referenciado na aplicao local, e caso exista, ele o reutilizar. Abaixo temos a imagem que ilustra essa configurao de reuso:

http://www.israelaece.com/post/Reutilizando-tipos-entre-servicos.aspx

18/7/2011

Israel Aece | Reutilizando tipos entre servios

Page 3 of 3

Finalmente, a ltima opo que temos o compartilhamento do tipo entre o servio e o cliente . Inclusive, isso evita a necessidade de fazer a referncia para o servio, pois todos os artefatos que voc precisa para consumir o servio (que so os contratos), j estaro disponveis atravs do compartilhamento de uma DLL entre as pontas, o que obriga ambos os lados serem .NET. Qualquer uma dessas alternativas apontadas acima, tem como objetivo o compartilhamento/centralizao de tipos do lado do cliente, assim como podemos visualizar na imagem abaixo:

Currently rated 5.0 by 1 people Tags: contract, serializao, wsdl WCF Permalink | Comentrios (0)

Posts relacionados
WCF - Introduo
A Microsoft disponibiliza vrias tecnologias para o desenvolvimento de aplica...

Granularidade de Servios
Independentemente de qual tecnologia estamos utilizando, uma das grandes perguntas que nos fazemos a...

Movendo tipos entre Assemblies


Muitas vezes, quando estamos desenvolvendo algum componente, geralmente colocamos todos os tipo...

Os comentrios esto fechados


Powered by BlogEngine.NET 1.5.0.0 Theme by Mads Kristensen

http://www.israelaece.com/post/Reutilizando-tipos-entre-servicos.aspx

18/7/2011

Вам также может понравиться