Olá pessoal, tudo certo?

Cada vez mais tenho recebido perguntas sobre o uso de serviços baseados em WCF - Windows Communication Foundation. De fato, existem diversos aspectos de uma camada de serviços que o framework WCF atende muito bem. Entre as principais características aderentes ao modelo temos:

  • Framework dedicado para a comunicação entre sistemas;
  • Baseado em mensagens;
  • Multi-protocolo;
  • Multi-hosting;
  • Compatível com WS, WS-*, TCP, P2P, etc;
  • Adaptável e extensível, através da construção de novos dutos de transporte (bindings), adapters, endpoints, mecanismos de entrega de mensagens, etc;
  • Altamente configurável, o que permite um grande desacoplamento entre serviços e sua configuração, entre outros.

Existem ainda outros recursos importantes no WCF que adicionam ao modelo, como programação unificada para diversos métodos de conexão, controle de comportamentos (behaviors), endpoints e seus componentes, etc. A figura a seguir já é conhecida de todos e apresenta os atores de um serviço no WCF:

image 

Do mesmo modo, o WF - Windows Workflow Foundation trás uma série de recursos para a composição de atividades, introduzindo os conceitos de fluxo de trabalho, permitindo aos desenvolvedores tratarem diversos cenários, como fluxos de trabalho seqüencial, fluxos simples, fluxos baseados em máquinas de estado, com interações humanas, etc.

image

Portanto, é inevitável que a pergunta sobre o uso integrado de ambos os frameworks aconteça. A pergunta que devemos fazer na sequência é: como isso pode ser feito? e ainda, quais são as armadilhas nessa implementação? 

Para a primeira pergunta, um bom artigo que descreve um cenário de integração é este a seguir:

Integrating Windows Workflow Foundation and Windows Communication Foundation (by Jeremy Boyd)
Ref.: http://msdn2.microsoft.com/en-us/library/bb266709.aspx

O artigo apresenta um passo-a-passo que pode ser usado como exemplo na integração de serviços WF em WCF em cenários diversos. Vamos usá-lo como guia para apresentar alguns novos pontos de discussão que envolvem os dois framework.

  1. Criar o modelo de processos desejado no WF, identificando os pontos de decisão e interação entre serviços;
  2. Evitar o uso de muitos blocos de código em sequência (Code Shape). Sempre que possível, consolidar os blocos por linha de execucão no workflow do WF.
  3. Trabalhar com um checklist de verificações para a integração WCF/WF. De fato, manter um desenho da integração desejada sempre atualizada é um fator crítico;
  4. Definir os contratos de serviços de negócio envolvidos no projeto. Podemos identificar 3 grandes aspectos para um contrato de serviço:
    • As operações publicadas, que são os recursos que o serviço publica para seus consumidores (são os métodos da interface);
    • As mensagens que encapsulam os dados estruturados de cada solicitação e resposta, que são os argumentos e os tipos de retorno de cada método (são os contratos de mensagem ou os contratos de dados);
    • As definições de dados das entidades de negócio (business entities) que podem ser trocadas pelo serviço;
  5. Quando necessário, hospedar e manter o tempo de execução do fluxo de trabalho. Isso é feito através da adição de uma classes de extensão ao WF, através da interface IExtension<ServiceHostBase>. Veja mais aqui: http://msdn2.microsoft.com/en-us/library/ms554840(VS.85).aspx;
  6. Também, para fluxos de trabalho de longa duração, recomenda-se o uso de um modelo de persistência por SqlWorkflowPersistenceService. Isso garante a recuperação e manutenção do estado do fluxo enquanto sua duração. Veja mais aqui: http://msdn2.microsoft.com/en-us/library/system.workflow.runtime.hosting.sqlworkflowpersistenceservice.aspx;
  7. Verificar os pontos de configuração da implantação, através da definição dos valores para o endpoint do serviço WCF (Address, Binding e Contract);
  8. Para o consumo do serviço, podemos utilizar o padrão de fábrica ChannelFactory. Veja mais aqui: http://msdn2.microsoft.com/en-us/library/ms576132.aspx;
  9. Ainda, o WCF suporta alguns fluxos de mensagens alternativos, como comunicação unidirecional e duplex bidirecional. Os canais duplex podem ser bastante eficientes para sistemas com conexão mais forte, nos quais os dados possam ser enviados em qualquer direção. Importante estudar o cenário para a definição do tipo de fluxo de mensagem mais indicado. Esse tipo de configuração é feita através da chamada DuplexChannelFactory. Veja mais aqui: http://msdn2.microsoft.com/en-us/library/ms576164.aspx.

Bastante coisa, não é mesmo?

Relembrando, o Windows Workflow Foundation (WF) oferece uma estrutura geral para a definição de fluxos de trabalho e um mecanismo de controle que permite hospedar esses fluxos de trabalho em execução, além de interagir com eles. Ainda, o Windows Communication Foundation (WCF) fornece uma estrutura geral de criação de sistemas conectados, através de um modelo de programação unificada, completo e consistente, que oferece um conjunto amplo de recursos para a definição de serviços, como vimos acima.

Assim, realmente podemos aplicar esses dois frameworks de forma combinada, criando uma plataforma flexível e adaptável. O WF permite modelar e encapsular a lógica de negócio e os processos de negócio, enquanto o WCF fornece a infra-estrutura de mensagens para a comunicação entre sistemas.

Os passos acima não são o guia definitivo para a implementação de integrações WCF + WF. A idéia do post foi apontar alguns temas envolvidos na construção de soluções sofisticadas, utilizando os dois frameworks. E para relembrar uma outra discussão já feita aqui no blog, segue o link abaixo:

Windows Workflow Foundation - Uma alternativa para a camada de processos numa arquitetura SOA.
Ref.: http://blogs.msdn.com/wcamb/archive/2008/02/01/windows-workflow-foundation-uma-alternativa-para-a-camada-de-processos-numa-arquitetura-soa.aspx

Em posts futuros, ainda vamos dar uma olhada no impacto dessa integração WCF + WF sobre o Windows Server 2008, especificamente com o uso do Windows Process Activation Service (WAS).

Por enquanto é só! Até o próximo post :)

Waldemir.