Freigeben über


Sequential Workflow Service Library : integrando serviços WCF com workflows WF no .NET 3.5

Olá pessoal, tudo certo?

Em breve teremos a chegada do .NET 4.0, com uma série de inovações e melhorias em seus recursos. Entre os benefícios, a dupla WCF (Windows Communication Foundation) e WF (Windows Workflow Foundation) promete maior integração e aderência ao modelo híbrido de programação enterprise/cloud (local e nuvem).

Um desenho conhecido aparece abaixo, onde nosso workflow encapsula chamadas para outros serviços externos, enquanto ele mesmo é exportado como um serviço, para outros participantes da solução.

image

Esse tipo de cenário é bem interessante para arquiteturas de serviços, onde pequenas orquestrações podem coordenar chamadas diversas para serviços da infra-estrutura. Assim, desenhos como esse abaixo são comuns em muitas empresas:

image

Com o .NET 3.0 era possível o consumo de serviços a partir de workflows em WF somente através de interfaces Web Services. Esse tipo de interação era obtida com os shapes de invocação e tratamento de Web Services, como o InvokeWebService, WebServiceInput, WebServiceOutput e WebServiceFault.

image

Com o .NET 3.5, a integração WCF + WF aumentou, com templates interessantes como o Sequential Workflow Service Library, objeto deste post.

Nesses últimos dias, tenhos conversado com muitas empresas que têm perguntado sobre essa integração entre interfaces de serviços e workflows em soluções para diversos cenários.

Como criar um SERVIÇO como um WORKFLOW?

Para a criação de um serviços como workflow, o .NET 3.5 oferece o template Sequential Workflow Service Library, que oferece uma interface de publicação WCF para um workflow WF.

image

Através deste template, temos a disposição todos os shapes e recursos do WF para a coordenação de atividades e chamadas para outros serviços ou mesmo outros workflows da solução. Ao mesmo tempo, esse workflow implementa uma interface IWorkflow, que exporta um contrato de serviço, permitindo que aplicações clientes disparem mensagens para consumo. No template, a interface IWorkflow implementa um método GetData(..) exemplo, o mesmo implementado pelo template de WCF Service Library.

image

A figura ao lado ilustra o template Sequential Workflow Service Library como oferecido pelo Visual Studio e o .NET 3.5.

Podemos adicionar novas interfaces de serviços através da adição de novos contratos de operação ou mesmo contratos de dados na interface IWorkflow, conforme a necessidade.

Ao mesmo tempo, podemos adicionar novos shapes de WF ao workflow, para o tratamento dos valores de entrada e execução da lógica de negócio desejada, preparando o valor de retorno do serviço.

Um exemplo de serviço WCF implementado como um WF é dado a seguir, veja:

imageArquivo: workflow1.cs

No serviço acima, temos uma primeira atividade codeActivity1 que recebe o valor de entrada do serviço na variável InputValue. Os argumentos de entrada (InputValue) e saída (ReturnValue) do serviço são de fato oferecidos pelo template, como vemos a seguir:

image

No exemplo acima, o valor InputValue é colocado na propriedade myCond, que é testada na condição do shape ifElseActivity1. Para teste, foi criada uma cláusula declarativa de condição myCond, que verifica se o valor de myCond é igual a 0. Se for, a atividade codeActivity2 é executada, caso contrário, a atividade codeActivity3 é executada. No final, codeActivity4 adiciona uma string na mensagem de retorno do serviço, que feito através da propriedade ReturnValue do serviço.

O código completo deste serviço é dado a seguir:

    1: using System;
    2: using System.Workflow.Activities;
    3:  
    4: namespace myWorkflowService
    5: {
    6:     public sealed partial class Workflow1 : SequentialWorkflowActivity
    7:     {
    8:         // Minha variável interna para teste de condição no workflow.
    9:         public int myCond = 0;
   10:  
   11:         public Workflow1()
   12:         {
   13:             InitializeComponent();
   14:         }
   15:  
   16:         // These variables are bound to the input and output parameters of the ReceiveActivity.
   17:         private String returnValue;
   18:         private Int32 inputValue;
   19:  
   20:         public Int32 InputValue
   21:         {
   22:             get { return inputValue; }
   23:             set { inputValue = value; }
   24:         }
   25:  
   26:         public string ReturnValue
   27:         {
   28:             get { return returnValue; }
   29:             set { returnValue = value; }
   30:         }
   31:  
   32:         private void codeActivity1_ExecuteCode(object sender, EventArgs e)
   33:         {
   34:             this.myCond = InputValue;
   35:         }
   36:  
   37:         private void codeActivity2_ExecuteCode(object sender, EventArgs e)
   38:         {
   39:             ReturnValue = "passei pelo IF";
   40:         }
   41:  
   42:         private void codeActivity3_ExecuteCode(object sender, EventArgs e)
   43:         {
   44:             ReturnValue = "passei pelo ELSE";
   45:         }
   46:  
   47:         private void codeActivity4_ExecuteCode(object sender, EventArgs e)
   48:         {
   49:             ReturnValue = ReturnValue + " - Fim!";
   50:         }
   51:     }
   52: }

Para testes, podemos usar o WCF Test Client do Visual Studio para exercitar chamadas ao serviço, alterando os valores de entrada do método GetData, como vemos abaixo:

image

Desse modo, vimos um bom exemplo de template que pode ser usado em nossas aplicações e soluções envolvendo os conceitos de interfaces de serviços e workflows, integrando os recursos do WCF e do WF no .NET 3.5.

Em posts futuros, vamos falar um pouco mais sobre a integração WCF+WF no .NET 4.0 e as novidades que estarão chegando, fiquem ligados!

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

Waldemir.

Comments

  • Anonymous
    March 30, 2009
    Muito interessante! estaremos esperando o .Net 4.0.

  • Anonymous
    March 30, 2009
    The comment has been removed