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.

  1. Um funcionário da empresa X cria um aplicativo de propostas (RFP).

    1. O funcionário no título e a descrição de RFP.

    2. O funcionário seleciona fornecedores que a empresa deseja convidar para enviar propostas.

  2. O funcionário envia a proposta.

    1. Uma instância de fluxo de trabalho é criada.

    2. O fluxo de trabalho está aguardando todos os editores para enviar suas propostas.

  3. As propostas são recebidas completos, o fluxo de trabalho itera com todas as propostas recebidas e selecione melhor.

    1. Cada fornecedor tem uma reputação (este exemplo armazena a lista de reputação em VendorRepository.cs).

    2. Total de valor proposta é determinado por (o valor tipado no fornecedor) (*) escrita de reputação de fornecedor/100.

  4. 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

  1. Usando o Visual Studio, abra o arquivo de solução PurchaseProcess.sln.

  2. 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.

  3. 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.

  4. Para criar a solução, pressione CTRL+SHIFT+B.

  5. 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.