Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O exemplo PurchaseProcess mostra como criar um processo de compra baseado em Solicitação de Propostas (RFP) muito básico com a melhor seleção automática de proposta. Ele combina Parallel, ParallelForEach<T>e ForEach<T> uma 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 de atividades.
Favoritos.
Persistência.
Persistência esquematizada.
Rastreamento.
Rastreio.
Hospedando o WF em clientes diferentes (ASP.NET aplicativos Web e aplicativos WinForms).
Descrição do processo
Este exemplo mostra uma implementação de um programa do Windows Workflow Foundation (WF) para reunir propostas de fornecedores para uma empresa genérica.
Um funcionário da Empresa X cria uma RFP (Solicitação de Proposta).
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 funcionário envia a proposta.
Uma instância do fluxo de trabalho é criada.
O fluxo de trabalho está aguardando que todos os fornecedores enviem suas propostas.
Depois que todas as propostas são recebidas, o fluxo de trabalho itera em 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) * (Reputação registrada do fornecedor) /100.
O solicitante original pode ver todas as propostas enviadas. A melhor proposta é apresentada em uma seção especial do relatório.
Definição do processo
A lógica principal do exemplo usa uma atividade ParallelForEach<T> que espera pelas ofertas de cada fornecedor (usando uma atividade personalizada que cria um marcador) e registra a proposta do fornecedor como uma solicitação de proposta (usando uma atividade InvokeMethod).
O exemplo então itera por todas as propostas recebidas armazenadas no RfpRepository, calculando o valor ajustado (usando as atividades Assign e System.Activities.Expressions) e, se o valor ajustado for melhor que a melhor oferta anterior, atribui o novo valor como a melhor oferta (usando as atividades If e Assign).
Projetos neste exemplo
Este exemplo contém os projetos a seguir.
| Projeto | Descrição |
|---|---|
| Comum | Os objetos de entidade usados dentro do processo (aplicativo de propostas, fornecedor, e proposta de provedor). |
| WfDefinition | A definição do processo (como um programa WF) e o host (PurchaseProcessHost) usado por aplicativos cliente para criar e usar as instâncias de compra processam o fluxo de trabalho. |
| 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 personalizado 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 personalizado para interagir com o mecanismo de fluxo de trabalho. |
WfDefinition
A tabela a seguir contém uma descrição dos arquivos mais importantes no projeto WfDefinition.
| Arquivo | 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 runtime de fluxo de trabalho e é usado em todos os aplicativos cliente carregar, executar, e interagir com as instâncias de fluxo de trabalho de PurchaseProcess . |
| 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 funcionalidade ao montar 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 funcionalidade personalizada. |
| WaitForVendorProposal.cs | Essa atividade personalizada deriva de NativeActivity e cria um marcador nomeado que deve ser retomado mais tarde 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 toda a funcionalidade do runtime de fluxo de trabalho por meio do ActivityContext que é passado para o Execute método. Este contexto oferece suporte para agendar e cancelar atividades filho, configurar zonas sem persistência (blocos executados durante o runtime não persistem os dados do fluxo de trabalho, como dentro de transações atômicas) e objetos Bookmark (identificadores para continuar fluxos de trabalho em pausa). |
| TrackingParticipant.cs | Um TrackingParticipant que recebe todos os eventos de acompanhamento 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 salva aplicações de fluxo de trabalho em arquivos XML. |
| XmlPersistenceParticipant.cs | Um elemento personalizado PersistenceParticipant que salva uma instância de um pedido de proposta em um arquivo 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 do projeto Common.
| Classe | Descrição |
|---|---|
| Fornecedor | Um fornecedor que envia propostas em um Pedido de Propostas. |
| Pedido de Proposta | Um pedido de propostas (RFP) é um convite para que os fornecedores enviem propostas em uma mercadoria ou serviço específico. |
| VendorProposal | Uma proposta enviada por um fornecedor a um RFP concreto. |
| VendorRepository | O repositório de Fornecedores. Essa implementação contém uma coleção de memória das instâncias de fornecedor e métodos para expor essas instâncias. |
| RfpRepository | O repositório de Solicitações para Propostas. Essa implementação contém usa Linq para XML consulte o arquivo XML de aplicativos de propostas gerados pela persistência esquematizada. |
| IOHelper | Essa classe trata todos os problemas de I/O-related (pastas, os caminhos, e assim por diante). |
Clientes web
A tabela a seguir contém uma descrição das páginas da Web mais importantes no projeto do Cliente Web.
| Arquivo | Descrição |
|---|---|
| CreateRfp.aspx | Cria e envia uma nova Solicitação de Propostas. |
| Default.aspx | Mostra todas as solicitações ativas e concluídas para propostas. |
| GetVendorProposal.aspx | Obtém uma proposta de um fornecedor em um pedido concreto de propostas. Esta página é usada somente por fornecedores. |
| ShowRfp.aspx | Mostrar todas as informações sobre uma Solicitação de Propostas (propostas recebidas, datas, valores e outras informações). Esta página é usada apenas pelo criador da Solicitação de Proposta. |
Cliente WinForms
A tabela a seguir contém uma descrição dos formulários mais importantes no projeto do Win Forms.
| Formulário | Descrição |
|---|---|
| NewRfp | Cria e envia uma nova Solicitação de Propostas. |
| MostrarPropostas | Mostrar todas as Solicitações de Propostas ativas e concluídas. Nota: 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 concreto de propostas. Essa janela é usada somente por fornecedores. |
| ViewRfp | Mostrar todas as informações sobre uma Solicitação de Propostas (propostas recebidas, datas, valores e outras informações). Essa janela é usada apenas pelo criador da Solicitação 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 arquivo XML com todas as Solicitações de Propostas ativas e concluídas. | GetTempPath |
| [instanceid] | Esse 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] .tracking | Um arquivo de texto com todos os eventos que ocorreram dentro de uma instância concreta. Esse arquivo é 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 cliente Web, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto do Cliente Web . Selecione Definir como Projeto de Arranque.
Para executar o projeto cliente WinForms, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto Cliente WinForms . Selecione Definir como Projeto de Arranque.
Para criar a solução, pressione CTRL+SHIFT+B.
Para executar a solução, pressione CTRL+F5.
Opções do cliente Web
Crie um novo RFP: cria uma nova Solicitação de Propostas (RFP) e inicia um fluxo de trabalho do Processo de Compra.
Atualizar: atualiza a lista de RFPs Ativos e Concluídos na janela principal.
Visualizar: mostra o conteúdo de um RFP existente. Os fornecedores podem enviar suas propostas (se convidados ou o RFP não estiver concluído).
Exibir como: O usuário pode acessar a RFP usando identidades diferentes selecionando o participante desejado na caixa de combinação Exibir como na grade ativa de RFPs.
Opções do cliente WinForms
Criar RFP: cria uma nova Solicitação de Propostas (RFP) e inicia um fluxo de trabalho do Processo de Compra.
Atualizar: atualiza a lista de RFPs Ativos e Concluídos na janela principal.
Exibir RFP: mostra o conteúdo de um RFP existente. Os fornecedores podem enviar suas propostas (se forem convidados ou se a RFP não estiver concluída)
Conectar como: o usuário pode acessar a RFP usando identidades diferentes selecionando o participante desejado na caixa de combinação de Exibir como na grade ativa de RFPs.