Processo de compra corporativo
O exemplo PurchaseProcess mostra como criar um processo de compra bem básico baseado em Solicitação de Propostas (RFP) com a seleção automática de melhor proposta. Combina Parallel, ParallelForEach<T>, e ForEach<T> e uma atividade personalizado 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 particular).
Demonstra
Atividades personalizados.
Composição de atividades.
Indicadores.
Persistência.
Persistência esquematizada.
Rastreamento.
Controlar.
Hospedar WF em diferentes clientes (aplicativos da Web ASP.NET e aplicativos WinForms).
Descrição do processo
Este exemplo mostra uma implementação de um programa WF (Windows Workflow Foundation) de reunir propostas de fornecedores para uma empresa genérica.
Um funcionário da empresa X cria um aplicativo de propostas (RFP).
O funcionário no título e a descrição de RFP.
O funcionário seleciona fornecedores que a empresa deseja convidar para enviar propostas.
O funcionário envia a proposta.
Uma instância de fluxo de trabalho é criada.
O fluxo de trabalho está aguardando todos os editores para enviar suas propostas.
As propostas são recebidas completos, o fluxo de trabalho itera com todas as propostas recebidas e selecione melhor.
Cada fornecedor tem uma reputação (este exemplo armazena a lista de reputação em VendorRepository.cs).
Total de valor proposta é determinado por (o valor tipado no fornecedor) (*) escrita de reputação de fornecedor/100.
O solicitador original pode ver todas as propostas enviadas. A melhor proposta é apresentada em uma seção especial no relatório.
Definição de processo
A lógica de núcleo de exemplo usa uma atividade de ParallelForEach<T> que espera as oferece de cada fornecedor (usando uma atividade personalizado que cria um indexador), e registra a proposta de fornecedor como um RFP (usando uma atividade de InvokeMethod ).
O exemplo efetua iterações em com todas as propostas recebidas armazenadas em RfpRepository
, calculando o valor definido (usando uma atividade de Assign e atividades de System.Activities.Expressions ), e se o valor definido é melhor do que a melhor oferecem anterior, atribui o novo valor como melhor oferecem (usando If e atividades de Assign ).
Projetos nisso exemplo
Este exemplo contém os seguintes projetos.
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. |
Clientes web | Um aplicativo ASP.NET cliente que permite aos usuários criarem e participarem nas instâncias do processo de compra. Usa um host de criado para interagir com o mecanismo de fluxo de trabalho. |
WinFormsClient | Um aplicativo cliente Windows Forms que permite aos usuários criarem e participem nas instâncias do processo de compras. Usa um host de criado 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 de WfDefinition.
Arquivo | Descrição |
---|---|
IPurchaseProcessHost.cs | Interface para o host de 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 de fluxo de trabalho do processo de compra (deriva de Activity). As atividades que derivam de Activity compõem a funcionalidade montando atividades personalizadas existentes e atividades da biblioteca de atividades do .NET Framework 4.6.1. Montar as atividades é a maneira mais básica de criar a funcionalidade personalizada. |
WaitForVendorProposal.cs | Esta atividade personalizado é derivado de NativeActivity e cria-se um indexador que deve ser nomeado que posteriormente por um fornecedor para enviar a proposta. As atividades que derivam de NativeActivity, como aqueles que derivam de CodeActivity, criam a funcionalidade imperativa substituindo Execute, mas também têm acesso a qualquer funcionalidade de runtime de fluxo de trabalho com ActivityContext que é passado para o método de Execute . 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 | TrackingParticipant que recebe todos os eventos de rastreamento e o 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 personalizado InstanceStore que salva aplicativos de fluxo de trabalho para arquivos XML. |
XmlPersistenceParticipant.cs | Um personalizado PersistenceParticipant que salva uma instância do aplicativo de propostas para um arquivo XML. |
AsyncResult.cs/CompletedAsyncResult.cs | O auxiliar classe implementando o padrão assíncrono para componentes de persistência. |
Comum
A tabela a seguir contém uma descrição das classes mais importantes no projeto comuns.
Classe | Descrição |
---|---|
Fornecedor | Um fornecedor que envia propostas em uma solicitação para propostas. |
RequestForProposal | Uma solicitação para propostas (RFP) é um convite para que fornecedores enviem propostas em uma mercadorias ou em um determinado serviço. |
VendorProposal | Uma proposta enviada por um fornecedor a um RFP concrete. |
VendorRepository | O armazenamento 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 armazenamento 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 de páginas da Web as mais importantes no projeto do cliente web.
Arquivo | Descrição |
---|---|
CreateRfp.aspx | Cria e envia uma nova solicitação para propostas. |
Default.aspx | Mostra todas as solicitações ativos e concluídas para propostas. |
GetVendorProposal.aspx | Obtém uma proposta de um fornecedor em uma solicitação concreta para propostas. Esta página é usada por fornecedores. |
ShowRfp.aspx | Mostrar todas as informações sobre uma solicitação para propostas (propostas recebidas, datas, valores, e outras informações.) Esta página é usada somente pelo criador do aplicativo de propostas. |
Cliente de WinForms
A tabela a seguir contém uma descrição de formulários os mais importantes no projeto formulários de vitória.
Formulário | Descrição |
---|---|
NewRfp | Cria e envia uma nova solicitação para propostas. |
ShowProposals | Mostrar todas as solicitações ativos e concluídas para propostas. Observação: Talvez você precise clicar no botão Atualizar na interface do usuário para ver as alterações na tela após criar ou modificar uma Solicitação de Proposta. |
SubmitProposal | Obter uma proposta de um fornecedor em uma solicitação concreta para propostas. Essa janela é usada por fornecedores. |
ViewRfp | Mostrar todas as informações sobre uma solicitação para propostas (propostas recebidas, datas, valores, e outras informações.) Essa janela é usada somente pelo criador da Solicitação para Propostas. |
Arquivos de persistência
A tabela a seguir mostra os arquivos gerados pelo provedor de persistência (XmlPersistenceProvider
) está localizada no caminho da pasta temporária do sistema atual (usando GetTempPath). O arquivo de rastreamento é criado no caminho atual de execução.
Nome do Arquivo | Descrição | Caminho |
---|---|---|
rfps.xml | O arquivo XML com todas as solicitações ativos e concluídas para propostas. | GetTempPath |
[instanceid] | Este arquivo contém todas informações sobre uma instância de fluxo de trabalho. Este arquivo é gerado pela implementação esquematizada de persistência (PersistenceParticipant em XmlPersistenceProvider). |
GetTempPath |
[instanceId] .tracking | Um arquivo de texto com todos os eventos que ocorreram em uma instância concreta. Este arquivo é gerado por TrackingParticipant. |
GetTempPath |
PurchaseProcess.Tracing.TraceLog.txt | O arquivo de rastreamento gerado pelo fluxo de trabalho com base nas definições de configuração no App.config ou nos arquivos 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 de cliente web, abra o Gerenciador de Soluções e clique com o botão direito do mouse no projeto Cliente Web. Selecione Definir como Projeto de Inicialização.
Para executar o projeto de 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 Inicialização.
Para criar a solução, pressione CTRL+SHIFT+B.
Para executar a solução, pressione CTRL+F5.
Opções de cliente web
Criar nova RFP: Cria uma nova Solicitação de Propostas (RFP) e inicia um fluxo de trabalho do processo de compras.
Atualizar: Atualiza a lista de RFPs ativas e concluídas na janela principal.
Exibir: Mostra o conteúdo de uma RFP existente. Fornecedores podem enviar suas propostas (ou convidado se o RFP não for 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 de cliente de WinForms
Criar RFP: Cria uma nova Solicitação de Propostas (RFP) e inicia um fluxo de trabalho do processo de compras.
Atualizar: Atualiza a lista de RFPs ativas e concluídas na janela principal.
Exibir RFP: Mostra o conteúdo de uma RFP existente. Fornecedores podem enviar suas propostas (ou convidado se o RFP não é concluído)
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.