Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
O exemplo PurchaseProcess mostra como criar um processo de compra baseado em Solicitação de Propostas (RFP) muito básico com a seleção automática de melhores propostas. Ele combina Parallel, ParallelForEach<T>e uma ForEach<T> atividade personalizada para criar um fluxo de trabalho que representa o processo.
Este exemplo contém um aplicativo cliente ASP.NET que permite interagir com o processo como participantes diferentes (como o solicitante original ou um fornecedor específico).
Demonstra
Atividades personalizadas.
Composição das atividades.
Marcadores.
Persistência.
Persistência esquematizada.
Rastreamento.
Rastreamento.
Execução de WF em diferentes clientes (aplicações Web ASP.NET e aplicações WinForms).
Descrição do processo
Este exemplo mostra uma implementação de um programa Windows Workflow Foundation (WF) para reunir propostas de fornecedores para uma empresa genérica.
Um funcionário da Empresa X cria uma Solicitação de Proposta (RFP).
O funcionário digita o título e a descrição da RFP.
O funcionário seleciona os fornecedores que deseja convidar para enviar propostas.
O trabalhador apresenta a proposta.
Uma instância do fluxo de trabalho é criada.
O fluxo de trabalho está aguardando que todos os fornecedores enviem suas propostas.
Depois de todas as propostas serem recebidas, o fluxo de trabalho itera todas as propostas recebidas e seleciona a melhor.
Cada fornecedor tem uma reputação (este exemplo armazena a lista de reputação em VendorRepository.cs).
O valor total da proposta é determinado por (O valor digitado pelo fornecedor) * (A reputação registrada do fornecedor) / 100.
O requerente original pode ver todas as propostas apresentadas. A melhor proposta é apresentada numa secção especial do relatório.
Definição do Processo
A lógica central do exemplo usa uma ParallelForEach<T> atividade que aguarda as ofertas de cada fornecedor (usando uma atividade personalizada que cria um marcador) e registra a proposta do fornecedor como uma RFP (usando uma InvokeMethod atividade).
A amostra então percorre todas as propostas recebidas armazenadas no RfpRepository, calculando o valor ajustado (usando atividades de Assign e de System.Activities.Expressions), e se o valor ajustado for melhor do que a melhor oferta anterior, atribui o novo valor como a melhor oferta (usando atividades de If e de Assign).
Projetos neste exemplo
Este exemplo contém os seguintes projetos.
| Projeto | Descrição |
|---|---|
| Comum | Os objetos de entidade usados no processo (Pedido de Proposta, Fornecedor e Proposta do Fornecedor). |
| WfDefinição | A definição do processo (como um programa WF) e do host (PurchaseProcessHost) utilizado por aplicações cliente para criar e utilizar instâncias do fluxo de trabalho do processo de compra. |
| WebClient | Um aplicativo cliente ASP.NET que permite que os usuários criem e participem de instâncias do processo de compra. Ele usa um host criado sob medida para interagir com o mecanismo de fluxo de trabalho. |
| WinFormsClient | Um aplicativo cliente do Windows Forms que permite que os usuários criem e participem de instâncias do processo de compra. Ele usa um host criado sob medida para interagir com o mecanismo de fluxo de trabalho. |
WfDefinição
A tabela a seguir contém uma descrição dos arquivos mais importantes no projeto WfDefinition.
| Ficheiro | Descrição |
|---|---|
| IPurchaseProcessHost.cs | Interface para o host do fluxo de trabalho. |
| PurchaseProcessHost.cs | Implementação de um host para o fluxo de trabalho. O host abstrai os detalhes do tempo de execução do fluxo de trabalho e é usado em todos os aplicativos cliente para carregar, executar e interagir com PurchaseProcess instâncias de fluxo de trabalho. |
| PurchaseProcessWorkflow.cs | Uma atividade que contém a definição do fluxo de trabalho do Processo de Compra (deriva de Activity). Atividades que derivam de Activity compõem a funcionalidade ao reunir atividades personalizadas existentes e atividades da biblioteca de atividades do .NET Framework 4.6.1. Montar essas atividades é a maneira mais básica de criar funcionalidades personalizadas. |
| WaitForVendorProposal.cs | Esta atividade personalizada deriva de NativeActivity e cria um marcador nomeado que deve ser retomado posteriormente por um fornecedor ao enviar a proposta. Atividades que derivam de NativeActivity, como aquelas que derivam de CodeActivity, criam funcionalidade imperativa substituindo Execute, mas também têm acesso a todas as funcionalidades do tempo de execução do fluxo de trabalho através do ActivityContext que é passado para o Execute método. Esse contexto tem suporte para agendar e cancelar atividades filhas, configurar zonas sem persistência (blocos de execução durante os quais o runtime não persiste os dados do fluxo de trabalho, como em transações atómicas) e Bookmark objetos (referências para retomar fluxos de trabalho pausados). |
| TrackingParticipant.cs | A TrackingParticipant que recebe todos os eventos de rastreamento e os salva em um arquivo de texto. Os participantes de rastreamento são adicionados à instância do fluxo de trabalho como extensões. |
| XmlWorkflowInstanceStore.cs | Um InstanceStore personalizado que guarda aplicações de fluxo de trabalho em arquivos XML. |
| XmlPersistenceParticipant.cs | Um PersistenceParticipant personalizado que salva um pedido de proposta num ficheiro XML. |
| AsyncResult.cs / CompletedAsyncResult.cs | Classes auxiliares para implementar o padrão assíncrono nos componentes de persistência. |
Comum
A tabela a seguir contém uma descrição das classes mais importantes no projeto Common.
| Classe | Descrição |
|---|---|
| Fornecedor | Um fornecedor que envia propostas em uma Solicitação de Propostas. |
| Pedido de Proposta | Uma solicitação de propostas (RFP) é um convite para que os fornecedores enviem propostas sobre uma mercadoria ou serviço específico. |
| Proposta do Fornecedor | Uma proposta apresentada por um fornecedor a uma RFP concreta. |
| VendorRepository | O repositório de fornecedores. Essa implementação contém uma coleção na memória de instâncias de Vendor e métodos para expor essas instâncias. |
| RfpRepository | O repositório de Pedidos de Propostas. Esta implementação utiliza Linq to XML para efetuar consultas ao ficheiro XML de Solicitações de Propostas geradas pela persistência esquematizada. |
| IOHelper | Essa classe lida com todos os problemas relacionados a Entrada/Saída (pastas, caminhos, entre outros). |
Cliente Web
A tabela a seguir contém uma descrição das páginas da Web mais importantes no projeto Web Client.
| Ficheiro | Descrição |
|---|---|
| CreateRfp.aspx | Cria e submete um novo Pedido de Propostas. |
| Default.aspx | Mostra todos os Pedidos de Propostas ativos e concluídos. |
| ObterPropostaFornecedor.aspx | Obtém uma proposta de um fornecedor em uma solicitação de propostas concreta. Esta página é usada apenas por fornecedores. |
| ShowRfp.aspx | Mostrar todas as informações sobre um Pedido de Propostas (propostas recebidas, datas, valores e outras informações). Esta página é usada apenas pelo criador do Pedido de Proposta. |
Cliente WinForms
A tabela a seguir contém uma descrição dos formulários mais importantes no projeto Win Forms.
| Formulário | Descrição |
|---|---|
| NewRfp | Cria e submete um novo Pedido de Propostas. |
| MostrarPropostas | Mostrar todos os Pedidos de Propostas ativos e concluídos. Observação: Talvez seja necessário clicar no botão Atualizar na interface do usuário para ver as alterações nessa tela depois de criar ou modificar uma Solicitação de Proposta. |
| EnviarProposta | Obtenha uma proposta de um fornecedor em um Pedido de Propostas concreto. Esta janela é usada apenas por fornecedores. |
| ViewRfp | Mostrar todas as informações sobre um Pedido de Propostas (propostas recebidas, datas, valores e outras informações). Esta janela é utilizada apenas pelo criador do Pedido de Propostas. |
Arquivos de persistência
A tabela a seguir mostra que os arquivos gerados pelo provedor de persistência (XmlPersistenceProvider) estão localizados no caminho da pasta temporária do sistema atual (usando GetTempPath). O arquivo de rastreamento é criado no caminho de execução atual.
| Nome do arquivo | Descrição | Caminho |
|---|---|---|
| rfps.xml | O ficheiro XML com todos os Pedidos de Propostas ativos e concluídos. | GetTempPath |
| [ID da instância] | Este arquivo contém todas as informações sobre uma instância de fluxo de trabalho. Esse arquivo é gerado pela implementação de persistência esquematizada (PersistenceParticipant em XmlPersistenceProvider). |
GetTempPath |
| [instanceId].rastreio | Um arquivo de texto com todos os eventos que ocorreram dentro de uma instância concreta. Este ficheiro é gerado por TrackingParticipant. |
GetTempPath |
| PurchaseProcess.Tracing.TraceLog.txt | O arquivo de rastreamento gerado pelo fluxo de trabalho com base nos parâmetros de configuração nos arquivos App.config ou Web.config. | Caminho de execução atual |
Para usar este exemplo
Usando o Visual Studio, abra o arquivo de solução PurchaseProcess.sln.
Para executar o projeto Web Client, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto Web Client . Selecione Definir como projeto de inicialização.
Para executar o projeto WinForms Client, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto WinForms Client . Selecione Definir como projeto de inicialização.
Para criar a solução, pressione CTRL+SHIFT+B.
Para executar a solução, pressione CTRL+F5.
Opções do Web Client
Criar uma nova RFP: cria uma nova RFP (Request for Proposals) e inicia um fluxo de trabalho do Processo de Compra.
Atualizar: atualiza a lista de RFPs Ativas e Concluídas na janela principal.
Exibir: mostra o conteúdo de uma RFP existente. Os fornecedores podem enviar suas propostas (se convidados ou se a RFP não estiver concluída).
Ver como: O utilizador pode aceder à RFP usando identidades diferentes, selecionando o participante desejado na caixa de seleção Ver como na grelha de RFPs ativas.
Opções de cliente WinForms
Criar RFP: cria uma nova RFP (Solicitação de Propostas) e inicia um fluxo de trabalho do Processo de Compra.
Atualizar: atualiza a lista de RFPs Ativas e Concluídas na janela principal.
Exibir RFP: mostra o conteúdo de uma RFP existente. Os fornecedores podem enviar suas propostas (se convidados ou se a RFP não estiver concluída)
Conectar como: O utilizador pode aceder à RFP usando identidades diferentes, selecionando o participante desejado na caixa de seleção Exibir como na grelha de RFPs ativas.