Daniel Franco Abrahão de Oliveira (daniel.oliveira@studentpartners.com) O autor atua como desenvolvedor de software em .NET. É Microsoft Student Partner desde junho de 2007 e é Microsoft Certified Technology Specialist in Web Applications.

Estrutura do artigo:

·         Introdução ao WF

·         Motivações

·         Tipos de Workflow

·         Exemplo de workflow Simples

·         Atividades

·         Serviços

Introdução ao WF

 

         Com o lançamento do .NET Framework 3.0 a Microsoft nos trouxe quatro novas tecnologias: Windows Communication Foundation (WCF), Windows Presentation Foundation (WPF) e Windows Workflow Foundation (WF) e CardSpace.

         É importante deixar bem claro que o Windows Workflow Foundation não é um produto de Workflow e sim uma plataforma para desenvolver aplicações baseadas em workflows. A Microsoft não espera que o Workflow Foundation seja levado ao usuário final. O que o usuário final irá receber são aplicações construídas usando o WF, ficando isso explícito ao usuário ou não.

         Com o WF podemos modelar quaisquer processos usando atividades desenvolvidas pela Microsoft, e que vem com o .NET 3.0, ou atividades customizadas.

 

Motivações

 

         Tanto processos de negócio quanto processos computacionais podem ser modelados usando Workflow Foundation. Neste artigo vamos nos ater aos processos de negócio.

         Quando falamos de um processo de negócio estamos falando de processos que podem durar horas, dias, meses ou anos até que sejam finalizados. Nesses processos, tipicamente, tempos a interação de pessoas, ou seja, determinados momentos do workflow, o que chamaremos de Atividades, podem requerer a interação de uma pessoa para que o fluxo possa continuar.

         Processos de negócio requerem interação de uma grande variedade de partes, dessa forma um requisito de uma plataforma de Workflow é coordenação. Pessoas interagem com instâncias de um processo que está sendo executado. Cada instância pode ter um tempo de vida de horas, dias, semanas e até meses. Dessa forma temos os workflows de longa-duração(long-running).

         Modelando visualmente um processo de negócio em forma de workflow, temos uma vantagem clara que é o entendimento sobre o processo. Uma vez modelado visualmente o processo se torna mais claro e a possibilidade de otimização sobre esse processo aumenta.

Porém, a simples representação visual não é o bastante. Outra vantagem que temos com o WF é que além da representação visual temos a instância do workflow sendo executada. Dessa forma outro benefício trazido é o monitoramento. Uma vez que estamos gravando informações sobre cada instância do processo que está sendo executada, podemos acompanhar a execução, saber em que momento da execução está cada instância, quantas são as instâncias e quaisquer outras informações que possam ser necessárias. Visto que temos a vantagem da representação visual e das informações gravadas sobre a execução de cada instância, podemos trabalhar em cima desses dados para aperfeiçoar os processos de negócio.  

         Uma possibilidade de uso do WF, conforme veremos detalhes mais à frente, é levar ao usuário do sistema o papel de definir a modelagem dos processos de negócio, usando atividades de negócio criadas pelos desenvolvedores do produto. Quem desenvolve software sabe que levar ao usuário final esse tipo de funcionalidade pode ser uma tarefa bem complexa, para gerar uma aplicação com “partes” desconectadas. Isso pode ser traduzido em outro benefício do Workflow Foundation, tornar o software flexível a ponto de o usuário final poder modelar o processo que será seguido.

 

Tipos de Workflow

 

         Temos dois tipos de workflow disponíveis no WF. O primeiro que veremos é o Sequential-Workflow (Workflow Seqüencial), e logo em seguida o State-Machine Workflow (Workflow de Máquina de Estado). Na verdade há um terceiro tipo de workflow, o Data-driven workflow. Sobre este irei fazer alguns comentários posteriormente.

         O estilo de workflow clássico que temos é o workflow seqüencial. Um exemplo de processo que seria indicado ser modelado com o workflow seqüencial: um funcionário solicita uma folga. O gerente desse funcionário recebe o pedido e decide se aprova ou não. Se ele aprovar o funcionário recebe a confirmação da aprovação e então encerra o workflow, senão, se o pedido não for aprovado, o workflow é encerrado.

img01.JPG

Figura 1 - Exemplo de workflow seqüencial

 

O que caracteriza um workflow seqüencial é que quem controla o fluxo é o workflow. De maneira alguma quer dizer que o workflow seqüencial é sempre uma seqüência simples de atividades. Esse estilo de workflow pode ter operadores de repetição, de decisão e mais. Se o conceito, de que quem controla o fluxo é o workflow, ainda não foi bem entendido, será em seguida quando dermos uma olhada no outro estilo de workflow.

         O segundo estilo que temos é o Workflow de máquina de estado.  Vejamos o seguinte exemplo: eu estou testando um software e identifico um bug. Defino uma tarefa para o desenvolvedor responsável para corrigir o bug. Esse desenvolvedor repassa a tarefa para outro desenvolvedor. Esse outro desenvolvedor rejeita o bug alegando que não foi testado corretamente. O testador re-abre passando mais informações para o desenvolvedor entender melhor o bug.

Se esse processo fosse modelado utilizando o workflow seqüencial, teríamos uma quantidade muito grande de laços de repetição e operadores de decisão. Definindo estamos como: aberto, cancelado, corrigido, poderíamos modelar mais facilmente esse fluxo.

                                 img02.JPG

Por fim o outro estilo de workflow que temos é o chamado Data-Driven. Embora em muitos lugares ele seja tratado como um terceiro estilo de workflow, eu prefiro definir como um uso específico do workflow seqüencial ou do workflow de máquina de estado. Acredito que essa definição caiba melhor por esse modelo de workflow dirigido a dados é construído sobre o workflow seqüencial ou de máquina de estado, portanto não pode contar como um terceiro estilo de workflow.

Exemplo de Workflow

         Para entender como iniciar o desenvolvimento de um software com Workflow Foundation vamos construir um exemplo simples de workflow e vamos usá-lo durante o artigo para demonstrar alguns conceitos novos.

         Iremos usar um template de projeto, do Visual Studio, chamado Sequential Workflow Console Application. Iremos desenvolver os workflows usando C#.

         img03.JPG 

         Clique em Ok para criar o projeto e vamos verificar alguns dos itens que ele já cria na estrutura do nosso projeto.        

         No nosso projeto já temos criado o arquivo Workflow1.cs e Program.cs. O Workflow1.cs é o workflow criado por Default e o arquivo Program.cs é o host do workflow. É nesse arquivo que o workflow é instanciado e executado.

imagem07.JPG

Figura 2 - Código do arquivo Program.cs

Na primeira linha vemos o WorkflowRuntime sendo instanciado. Esse objeto é o responsável pela criação das instâncias de workflow. Só pode haver uma instância de WorkflowRuntime por domínio de aplicação.  O objeto criado na segunda linha de código irá ser usado para que a aplicação não encerre sem que o workflow seja executado. Em seguida vamos assinar dois eventos do workflowruntime: WorkflowCompleted e WorkflowTerminated. Esses dois eventos serão executados, respectivamente, quando a instância de um workflow completar sua execução e quando ela for interrompida. Logo após temos a linha de código que realmente cria a instância do nosso workflow. Em seguida o workflow é executado.

Vamos agora montar o nosso primeiro workflow e executá-lo.

Abra o arquivo Workflow1.cs.       Observe que na toolbox temos uma série de atividades sob a seção Workflow Foundation.  Arraste uma atividade, chamada Code, da Toolbox para o Workflow.

img04.JPG

Figura 3 - Workflow1.cs[Design]

Observe que no canto superior direito da nossa atividade temos um ponto de exclamação. Esse símbolo é exibido quando há algo errado com a atividade. Clicando nesse símbolo veremos uma mensagem indicando que a propriedade ExecuteCode não foi definida. Essa propriedade determina qual método será executado quando essa atividade for invocada.  Dê um duplo-clique na superfície da atividade para que seja gerado o EventHandler. Digite a seguinte linha de código no corpo do método:

            Console.WriteLine("Atividade executada em: {0} ", System.DateTime.Now.ToLongTimeString());


Aperte Control+F5 e veja o resultado do nosso workflow.

Atividades

         O Workflow Foundation nos traz algumas atividades já definidas. Algumas delas são:

·         Code –Executa um trecho de código.

·         CallExternalMethod – Faz a chamada de um método que está implementado na aplicação host. Isso acontece definindo uma interface e criando uma classe que implementa essa interface. No WorkflowRuntime essa classe é adicionada aos serviços. Com essa atividade podem ser passados dados para a aplicação host.

·         Delay – Suspense a execução do workflow por um tempo determinado. Quando essa atividade é executada o workflow entra no estado Idled(ocioso).

·         HandleExternalMethod – Essa atividade faz com que o workflow entre no estado ocioso e aguarde por um evento externo. Isso funciona da mesma maneira que com a atividade CallExternalMethod, utilizando uma interface e uma classe que deve implementá-la.

Uma grande característica do Workflow Foundation é a possibilidade da criação de atividades customizadas (Custom Activities). Com essa funcionalidade podemos criar atividades que atendem necessidades específicas.

Vamos criar agora uma atividade. No nosso projeto acesse Add – Activity. Na janela Add New Item clique em Add para criar a atividade.

No designer da nossa atividade arraste uma atividade Code, uma atividade Delay e outra atividade Code.

img05.JPG

Figura 4 - Activity1.cs[Design]

         Crie o EventHandler da primeira atividade Code e coloque no corpo do método a seguinte linha de código:

            Console.WriteLine("codeActivity1 executada em {0}", System.DateTime.Now.ToLongTimeString());

 

Faça o mesmo para a segunda atividade Code colocando a seguinte linha de código no corpo do método:

            Console.WriteLine("codeActivity2 executada em {0}", System.DateTime.Now.ToLongTimeString());

 

Na atividade Delay defina a propriedade TimeoutDuration para 00:00:05. Aperte F6 para compilar o projeto.

Retornando para o designer do workflow, observe que outra seção foi criada na toolbox:WorkflowConsoleApplication1Components. Nessa seção temos a nossa atividade Activity1. Delete a atividade Code existente no nosso workflow e arraste a atividade Activity1. Observe que no designer agora aparecem as três atividades definidas em Activity1 e que não é possível excluir alguma delas, somente a atividade Activity1 inteira. Aperte Control+F5 e veja o resultado do nosso workflow.

img06.JPG

Figura 5 - Workflow1.cs[Design]

 

Serviços

            Boa parte das funcionalidades do Workflow Foundation provém dos serviços que podemos adicionar ao WorkflowRuntime.

         Por Serviço entenderemos um objeto que é adicionado ao WorkflowRuntime e é por este gerenciado. Seguindo o modelo extensível do Workflow Foundation, podemos reescrever os serviços que vêm implementados no .NET Framework 3.0 ou criar novos serviços e adicioná-los ao WorkflowRuntime.

         Alguns dos serviços mais comuns:

·         SqlWorkflowPersistenceService – É o serviço de persistência de instâncias de workflow. Em um cenário onde você tem um processo long-running é necessário que em determinados momentos a instância do workflow seja removida da memória e seja persistida em um meio não-volátil. Esse serviço funciona com bases SQL Server. Para utilizar outro banco de dados basta re-implementar este serviço.

·         WorkflowTrackingService – Com o serviço de tracking você pode gravar três tipos diferentes de dados: sobre o Workflow, sobre as atividades e dados do usuário. Dados sobre o workflow são dados indicando os estados do workflow (Completed, Created, etc...). Sobre atividades também são dados indicando os estados das atividades (Executing, Completed, etc...). E dados de usuário podem ser dados de negócio que são trafegados pelo Workflow. Com esse serviço é possível armazenar um grande volume de dados sobre as instâncias de processos que são executados na sua empresa, para depois interagir com esses dados retirando relatórios, construindo um sistema de B.I. ou alguma outra utilidade identificada.

·         DataExchangeService – Esse serviço é usado para troca de dados entre a aplicação host e o Workflow.

 

Conclusão

         Como pudemos ver o Workflow Foundation é uma plataforma muito rica que irá auxiliar muito os desenvolvedores na criação de aplicações usando workflow.

         Quanto às possibilidades de uso temos várias: aplicações para call-center, serviços de gerências de servidores, aplicações ERP, entre muitas outras. Com essa plataforma em mãos só é necessário um pouco de criatividade e atenção aos requisitos, e com isso a qualidade e flexibilidade dos softwares podem melhorar muito.

         Para mais informações, constantemente público no meu blog (http://thespoke.net/blogs/dfa.oliveira/) alguns artigos sobre Workflow Foundation e também links para artigos do pessoal do time de Workflow Foundation, da Microsoft. E outra fonte de informações é o fórum de Workflow Foundation do MSDN (www.msdn.com.br) e o site do WF (http://wf.netfx3.com).

 

Daniel Franco Abrahão de Oliveira