Acessando Serviços

Agosto 15, 2007 at 12:44 pm 2 comentários

Este post tem o objetivo de apresentar uma solução que criei recentemente para acessar serviços externo à aplicação, obtendo os dados e formatando-os, conforme o padrão do projeto.

Problema
Obter informações de serviços externos à aplicaçao, independentemente do protocolo de comunicação, permitindo a formatação dos dados de retorno da aplicação e facilidade na execução do serviço, possibilitando fácil manutenabilidade e novos desenvolvimentos baseados nesta estrutura.

Contexto
O projeto em questão acessa dados em duas fontes diferentes, Commerce Server 2007 e SQL Server 2005.

Além destas duas fontes, o projeto terá que acessar dados obtidos a partir de outro serviço, seja por HTTP, SOAP, WCF, etc.

Solução
Para estabelecer qualquer tráfego de informações, será necessário determinar qual é o meio de comunicação, a formatação dos dados (pois as duas partes conversam em “idiomas” diferentes) e ainda por cima, como garantir que isto tudo seja configurável.

Para todos estes requisitos, resolvi criar uma solução que separasse em camadas da seguinte maneira:

  1. ServiceGateway: ou se desejarem, Remote Façade. Esta camada centraliza todas as chamadas aos serviços.
  2. ServiceGatewayImplementation: Responsável por criar o meio de comunicação, obter os dados e formatá-los.
    1. Para criar o meio de comunicação, utilizei o conceito de canais (mesmo de WCF). Estes canais são instanciados através de um Factory, que deverá decidir, a partir de uma configuração no web.config, qual o tipo de canal que será utilizado (HTTP, SOAP, WCF, etc).
    2. Para formatar os dados, utilizei uma camada chamada Assembler, que receberá, de forma genérica, os tipos de origem e de destino de cada objeto.

clip_image002_thumb3

Como podem ver, a camada de serviços é invocada a partir de uma camada BusinessObject. O service gateway pode efetuar alguma validação, mas normalmente irá repassar a chamada para a GatewayImplementation, centralizando a menor quantidade de lógica possível.
Já a GatewayImplementation é quem concentra a orquestração desta comunicação. Ela irá obter, através de um factory (ChannelFactory), o canal responsável pela comunicação. Este factory irá retornar o tipo de canal adequado (HTTP, WCF, SOAP, etc) de acordo com uma configuração no web.config, para um determinado provider. Este canal é quem executa a requisição, após a configuração do endereço do serviço e de seus parâmetros. Note que o canal é uma classe generic, o que possibilitará uma maior performance, sem executar boxing e unboxing.

IChannel<DataSet> channel = ChannelFactory<DataSet>.CreateChannel(“ProviderName”);
channel.SetServiceAddress(DigipixConstants.EnderecoLoginCliente);
channel.SetParameter<string>(“LOGIN”, “anobre@brq.com”);
return channel.Execute();

No retorno da execução, quando necessário, o Assembler deveré ser chamado para formatar os dados. Esta classe também é generic, e irá receber a informação do tipo do objeto que está recebendo, o tipo para o qual irá formatar e o objeto a ser formatado. Desta maneira,  fácil identificar qual o comportamento de formatação deverá ser executado (algo como “Se estou recebendo um XmlDocument e preciso transformar em um objeto Pedido, sei o que fazer!”).

DigipixAssembler<XmlDocument, Pedido> assembler = new DigipixAssembler<XmlDocument, Pedido>();
Pedidopedido = assembler.Assemble(channel.Execute());

Aguardo opiniões a respeito 🙂

Abraços!

Anúncios

Entry filed under: Arquitetura.

Project Astoria Gravação de Log utilizando MSMQ e BizTalk

2 comentários Add your own

  • 1. Ricardo Gomdi  |  Agosto 30, 2007 às 9:59 pm

    Andre,
    gostei muito da sua abordagem para o problema, parabens!

    Responder
  • 2. Oki  |  Setembro 1, 2007 às 2:17 pm

    Ok André, interessante. Mas como você irá implementar a comunicação via SOAP através dos channels?

    Responder

Deixe uma Resposta

Preencha os seus detalhes abaixo ou clique num ícone para iniciar sessão:

Logótipo da WordPress.com

Está a comentar usando a sua conta WordPress.com Terminar Sessão / Alterar )

Imagem do Twitter

Está a comentar usando a sua conta Twitter Terminar Sessão / Alterar )

Facebook photo

Está a comentar usando a sua conta Facebook Terminar Sessão / Alterar )

Google+ photo

Está a comentar usando a sua conta Google+ Terminar Sessão / Alterar )

Connecting to %s

Trackback this post  |  Subscribe to the comments via RSS Feed


Calendário

Agosto 2007
S T Q Q S S D
« Jul   Set »
 12345
6789101112
13141516171819
20212223242526
2728293031  

Most Recent Posts


%d bloggers like this: