Windows Workflow Foundation: Onde usar no mundo real?
Quando eu li rapidamente sobre o Windows Workflow Foundation eu fiquei impressionado. A interface gráfica, a facilidade, a similaridade com o Biztalk, a produtividade, tudo me chamou a atenção. Mas logo no minuto seguinte eu me perguntei: "Pra quê? Por que eu usuaria o Windows Workflow Foundation ao invés de utilizar uma solução customizada?".
Este post tem o objetivo de apresentar benefícios que o WF (Workflow Foundation) pode trazer às aplicações reais, assim como uma demonstração básica (mas real) da utilização de um workflow e os benefícios aqui apresentados.
Qualquer tipo de projeto é baseado em regras de negócios. Estas regras baseiam-se em definições e operações para atingir um determinado objetivo. Todas as regras são formadas pelo what e pelo how (veja http://en.wikipedia.org/wiki/Business_rules).
QUALQUER regra de negócio pode ser definida em um workflow.
Outro ponto importante sobre regras de negócio é que, no nosso mundo da tecnologia, as regras de negócio mudam. Infelizmente não temos como definir uma regra de negócio e simplesmente assumir que esta regra será desta maneira e pronto. As regras de negócio mudam, e precisamos estar preparados para responder a esta mudança da forma mais rápida possível.
Além disso, regras de negócio podem ser complexas demais. Tanto que alguns projetos em andamento, ou principalmente aqueles que já estão finalizados, existem regras de negócio que só o profissional diretamente envolvido entende. Manutenção? Nem pensar!
Partindo deste cenário, podemos listar algumas características relacionadas com regras de negócio:
- Regras de negócio sempre mudam;
- A complexidade pode trazer sérios problemas para o entendimento e manutenção destas regras;
- Toda regra de negócio pode ser definida em um workflow;
Ok, mas e agora? Como definir em termos arquiteturais algo que atenda estas características?
Aqui entra o Windows Workflow Foundation.
Como você já deve saber, o Windows Workflow Foundation é framework totalmente voltado para construção de workflows de forma rápida, fácil e confiável, além de permitir customização, fornecer segurança, performance e escalabilidade.
Algumas ótimas razões para utilizar WF [PROWF]:
- Fornece um poderoso e flexível framework para a construção de workflows, deixando o tempo para você se preocupar com problemas reais do negócio.
- Permite workflows sequencias ou máquinas de estado (http://en.wikipedia.org/wiki/Finite_state_machine)
- Suporta a habilidade de salvar um workflow e continuar depois.
- É de graça!
Agora a questão é: onde e como utilizar tudo isso?
Se sabemos que workflow está presente nas regras de negócio, e temos um framework poderoso, como utilizar isto para resolver nossos problemas?
Vamos levar este cenário em conta:
- Regras de negócio complexas;
- Equipe média / grande;
- Alto índice de alterações nos requisitos / regras;
Neste cenário, o Windows Workflow Foundation pode ser utilizado para compor as regras de negócio, utilizando métodos atômicos expostos em uma outra camada do projeto:
Claro que em questões arquiteturais esta não é a melhor solução. Este é apenas um exemplo para este post.
Vamos imaginar um fechamento de pedido em um sistema de e-commerce.
Algumas validações básicas são necessárias, referente à dados do cliente, dados de pagamento e entrega. Quando o usuário optar por fechar o pedido, todas as validações devem ser executadas e o resultado final deve ser devolvido para o método chamador.
Fiz um exemplo em ASP.NET + WF, assim como representado na figura acima. O ASP.NET tem o papel de obter as entidades customizadas e enviar para o workflow. A validação dos dados e comunicação com a camada de serviços é feita dentro deste fluxo de trabalho:
1: protected void FecharPedidoButton_Click(object sender, EventArgs e)
2: {
3: // Cria um novo cliente e associa com a Basket
4: Customer cliente = new Customer();
5: cliente.Name = "André Nobre";
6: cliente.Street = "Rua Lorem Ipsum, 99";
7: cliente.Email = "customer@ecommerce.com";
8:
9: // Cria o objeto Basket
10: Basket carrinho = new Basket(cliente);
11: carrinho.LineItems.Add(new LineItem("Televisão LCD 20'"));
12: carrinho.LineItems.Add(new LineItem("Blue-Ray"));
13:
14: // Dictionary que servirá como argumento para o workflow
15: Dictionary<string, object> wfArguments = new Dictionary<string, object>();
16: wfArguments.Add("basket", carrinho);
17: wfArguments.Add("wfResult", WorkflowReturn.Ok);
18:
19: // Instancia o Workflow Runtime
20: WorkflowRuntime wfRuntime = new WorkflowRuntime();
21:
22: // Cria a instancia do workflow para criação do pedido
23: WorkflowInstance wfInstance = wfRuntime.CreateWorkflow(typeof(PurchaseOrderWorkflow), wfArguments);
24:
25: // Adiciona um delegate para o final da execução do workflow
26: wfRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(wfRuntime_WorkflowCompleted);
27:
28: // Inicia o workflow
29: wfInstance.Start();
30: }
Como podem observar, o código é extremamente simples. Os objetos Customer, Basket, LineItem, foram criados de forma fixa, apenas para exemplo.
A figura abaixo representa o workflow criado para a validação dos dados e fechamento do pedido:
Como podem observar, o fluxo é extramemente intuitivo e de fácil manutenção. Cada atividade pode ser alterada, seja seu código ou sua localização, assim como se está ativo ou não.
Portanto, windows workflow foundation é a melhor opção quando trabalhamos nestes tipos de cenário. Com ele, é possível aumentar a produtividade e melhorar desempenhos, além de possibilitar o trabalho com equipes grandes de maneira fácil e simples.
Anexos
http://www.andrenobre.com.br/files/workflowpost.zip
Referência
[PROWF] Pro WF: Windows Workflow in .NET 3.0; BUKOVICS, Bruce; 2007
Abraços!
-- André