.NET

10 dez, 2010

Conhecendo mais o Workflow 4.0

Publicidade

O Windows Workflow Foundation (WF) foi disponibilizado pela Microsoft no .Net Framework 3.0, atualizado no 3.5 e inovado no 4.0. Com o WF, conseguimos desenvolver em fluxos e de forma visual, ou seja, visualizando o fluxo de um processo e os caminhos que ele poderá percorrer conforme as condições do  fluxo.

Vamos começar vendo alguns conceitos do WF. Existem dois tipo de workflow no .Net 4.0.

  • Sequence: existente nas versões anteriores, executa um conjunto de ações em seqüência sem retornar ao passo anterior.
  • Flowchart: lançado no .Net 4.0, permite retornar fluxos a passos anteriores.

Nota: No WF3 existia o tipo de workflow StateMachine, que não está mais disponível no WF4. Para migrar seu workflow para o WF4, infelizmente, até onde tenho conhecimento, será necessário reescrever seu WF.

Dentro de um WF também temos:

  • Variáveis: utilizadas para armazenar informações, assim como em programação possui um nome e um tipo (string, boolean, int, etc).
  • Argumentos: igual a parâmetro de métodos, levam informações de dentro para fora e de fora para dentro de um workflow. Podem ser do tipo In, Out ou In/Out.
  • Expressões: utilizadas para manipular dados. Por exemplo, concatenar duas strings. Importante: Devem ser definidas em Visual Basic, mesmo para projetos em C#.

Cada passo de um workflow é chamado de atividade. As atividades são ForEach, If, While, DoWhile, Switch, etc. Vamos começar a desenvolver os exemplos práticos.

Flowchart

Flowchart é um novo tipo de workflow disponibilizado no .Net 4.0. É recomendado para cenários onde exista a necessidade de interação humana.

Abra o Visual Studio e crie um projeto do tipo WorkFlow Console Application, como na imagem abaixo:

Criamos um projeto com o nome wfValidarUsuario. Um arquivo Workflow1.xmal foi criado. Apague esse arquivo e adicione um novo arquivo do tipo Activity com o nome wfValidarUsuario.xmal. Será nesse arquivo que vamos criar nosso WF.

Abra esse arquivo e na ToolBox arraste para onde está escrito Drop activity here o componente Flowchart. Você verá uma área com uma bola verde e um escrito Start. Dentro dessa área, coloque os seguintes componentes:

  • 3 WriteLine;
  • 1 Assign;
  • 1 FlowDecision;

Com esses componentes vamos criar nosso primeiro workflow.

Agora, vamos ligar nosso worklow. Ligue um componente WriteLine com a opção Start. Para isso, basta clicar o componente, e serão exibidas 4 opções em sua volta, clique em uma delas e arraste para um WriteLine.

Em seguida, ligamos esse WriteLine com o componente Assign. Esse componente irá setar um valor em uma variável, mas sobre isso falamos depois. Vamos ligar o Assign ao FlowDecision. Veja que esse componente exibe a opção True e False, vamos ligar a opção true a um WriteLine e a opção false ao outro WriteLine. Por fim, ligamos o WriteLine que foi ligado ao FlowDecision da opção False com o nosso primeiro WriteLine.

Veja na imagem abaixo como deve ficar nosso workflow.

Repare que um sinal de alerta vermelho aparece em Assign, isso porque não configuramos esse componente. Vamos a ele, então. Se você leu o artigo anterior, vai se recordar que comentamos sobre variáveis, vamos utilizar uma aqui.

Veja que na parte inferior da tela as opções Variables, Arguments e Imports. Selecione o componente FlowChart e clique em Variables. Crie uma variável chamada senha do tipo string. Lembre-se: podemos criar as variáveis por nível, nesse caso, criamos uma que todos os componentes dentro do FlowChart conseguem visualizá-la.

Agora, clique em Assign no campo To e coloque nossa variável Senha e no campo Enter a VB expression coloque Console.ReadLine(). Como expliquei no artigo anterior, mesmo que nosso workflow seja em C#, devemos escrever as expressões em VB.Net.

Faltam dois passos para finalizar nosso workflow, o primeiro é configurar o Decision, clique nele com o botão direito do mouse em propriedades, clique na propriedade Condition e coloque o seguinte código Senha = 123 (lembrando, tem que ser VB.Net).

E, para finalizar, precisamos chamar nosso workflow e para isso vamos usar a classe Program.cs. Coloque o seguinte código:

class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(new wfValidarUsuario());
Console.ReadLine();
}
}

Nosso código apenas invoca o workflow e depois pede para o console aguardar para que possamos visualizar o resultado.

Veja abaixo ficou nosso workflow finalizado:

Agora podemos executá-lo. Esse workflow terá a interação com o usuário. Enquanto não digitamos a senha 123, ele irá retornar para um passo anterior (no nosso caso pedir a senha novamente), veja um exemplo do console em execução:

Sequence

O WF Sequence já existia no .NET 3.5. Esse WF executa um conjunto de ações em uma determinada ordem informada e sem a possibilidade de retornar a um passo anterior. Nesse tipo de WF, podemos utilizar qualquer atividade de decisão (ForEach, If, Switch, While, etc), atividades de construção (Parallel por exemplo) ou até atividade customizadas.

Esse WF é recomendado para resolução de processos com complexidade moderada ou processos sem intervenção humana (diferente do Flowchart).

Vamos fazer um exemplo de WF Sequence, no qual vamos informar um código de produto e seremos informado se o mesmo existe disponível no estoque.

Abra o Visual Studio e crie um projeto do tipo WorkFlow Console Application com o nome wfVerificarEstoque. Em seguida, veja que um arquivo chamado Workflow1.xaml foi criado, exclua esse arquivo. Clique no projeto e em add new item. Adicione um item do tipo Activity com o nome wfVerificarEstoque.xaml. Abra esse arquivo e na ToolBox arraste para onde está escrito Drop activity here um componente Sequence que se encontra na toolbox na guia Control Flow.

Agora selecione o componente Sequence e crie uma variável com o nome QuantidadeEstoque do tipo Int32 e em seguida selecione a opção arguments e crie um argumento chamado codigoProduto do tipo Int32 com o direction In.

Arraste para dentro do Sequence um componente Switch. No componente Switch em Expression escreva  codigoProduto. Logo abaixo em Case value, adicione valor 1 e em seguida valor 2. Estamos criando um Switch (case) com se estive criando em C# ou VB.Net.

Com o case criado, arraste para dentro de cada case um componente Assign que se encontra na ToolBox na guia Primitives. No Case 1 no Assign escreva em To QuantidadeEstoque e na expressão VB coloque o valor 0. Faça o mesmo para o segundo case mudando o valor para 2. Nosso case deve ficar como da imagem abaixo:

Abaixo do Switch e dentro do Sequence, arraste um componente If. E e m Condition coloque QuantidadeEstoque > 0. Agora arraste um componente WriteLine para dentro do If na opção Then e outro WriteLine para dentro do If na opção Else. No WriteLine dentro do Then escreva  em Text: Produto em Estoque e no WriteLine dentro do Else escreva Produto em falta no estoque.

Nosso WF deve ficar igual da imagem abaixo:

Precisamos agora configurar a chamada ao nosso WF. Como criamos um arguments chamado codigoProduto, será necessário passar um valor para esse argumento em nosso WF. Para isso, utilizamos a class Dictionary que faz parte do namespace System.Collections.Generic.

Abra o arquivo Program.cs. e em using adicione a namespace citada acima e em seguida escreva o código abaixo:

static void Main(string[] args)
{
int intCodigoProduto = 2;

Dictionary<string, object> dtc = new Dictionary<string, object>();

dtc.Add("codigoProduto", intCodigoProduto);

WorkflowInvoker.Invoke(new wfVerificarEstoque(), dtc);

Console.ReadLine();
}

Veja que criamos um Dictionary, com uma string e um objeto. No campo string, escrevemos o mesmo nome de nosso arguments criado no WF e o objetc será o valor que passaremos para o WF. Observe que o dictionary recebe o mesmo nome e o mesmo tipo de nosso arguments, caso isso não aconteça, um erro irá acontecer.

Compile seu projeto e o console exibirá a seguinte frase: Produto em Estoque. Caso altere o valor de intCodigoProduto para 1, a frase será Produto em falta no Estoque. 

O código-fonte está disponível para download aqui.

Obrigado e até a próxima.