Processo di acquisto aziendale

L'esempio PurchaseProcess illustra come creare un semplice processo di acquisto basato su richiesta di proposta con la selezione automatica della proposta migliore. Vengono combinati gli oggetti Parallel, ParallelForEach<T> e ForEach<T>, nonché un'attività personalizzata per creare un flusso di lavoro che rappresenta il processo.

Questo esempio contiene un'applicazione client ASP.NET che consente l'interazione con il processo come partecipanti diversi, ovvero come il richiedente originale o un fornitore particolare.

Dimostra

  • Attività personalizzate.

  • Composizione di attività

  • Segnalibri.

  • Persistenza.

  • Persistenza schematizzata.

  • Traccia.

  • Rilevamento.

  • Hosting di Windows Workflow Foundation in client diversi (applicazioni Web ASP.NET e applicazioni WinForms).

Descrizione del processo

Questo esempio illustra un'implementazione di un programma Windows Workflow Foundation per raccogliere le proposte dei fornitori per una società generica.

  1. Un dipendente della società X crea una richiesta di proposta (RDP).

    1. Il dipendente digita il titolo e la descrizione della RDP.

    2. Il dipendente seleziona i fornitori a cui vuole richiedere di inviare proposte.

  2. Il dipendente invia la proposta.

    1. Viene creata un'istanza del flusso di lavoro.

    2. Il flusso di lavoro attende che tutti i fornitori inviino le proposte.

  3. Una volta ricevute tutte le proposte, il flusso di lavoro scorre tutte le proposte ricevute e seleziona la migliore.

    1. A ogni fornitore è assegnata una valutazione (in questo esempio l'elenco di valutazioni viene archiviato in VendorRepository.cs).

    2. Il valore totale della proposta è determinato da (valore digitato dal fornitore) * (valutazione registrata del fornitore) / 100.

  4. Il richiedente originale può vedere tutte le proposte inviate. La proposta migliore viene presentata in una sezione speciale del rapporto.

Definizione del processo

Nella logica principale dell'esempio viene usata un'attività ParallelForEach<T> che attende le offerte di ogni fornitore (tramite un'attività personalizzata che crea un segnalibro) e registra la proposta del fornitore come RDP (tramite un'attività InvokeMethod).

Nell'esempio vengono quindi scorse tutte le proposte ricevute archiviate in RfpRepository calcolando il valore regolato (tramite un'attività Assign e le attività System.Activities.Expressions) e se il valore regolato è più interessante rispetto alla migliore offerta precedente, il nuovo valore viene considerato l'offerta migliore (tramite le attività If e Assign).

Progetti di questo esempio

In questo esempio sono contenuti i progetti seguenti.

Project Descrizione
Comune Oggetti entità usati all'interno del processo (Richiesta di proposta, Fornitore e Proposta del fornitore).
WfDefinition Definizione del processo (come programma Windows Workflow Foundation) e dell'host (PurchaseProcessHost) usati dalle applicazioni client per la creazione e l'uso di istanze del flusso di lavoro del processo di acquisto.
WebClient Applicazione client ASP.NET che consente agli utenti di creare e partecipare alle istanze del processo di acquisto. Viene usato un host creato in modo personalizzato per interagire con il motore del flusso di lavoro.
WinFormsClient Applicazione client Windows Form che consente agli utenti di creare e partecipare alle istanze del processo di acquisto. Viene usato un host creato in modo personalizzato per interagire con il motore del flusso di lavoro.

WfDefinition

Nella tabella seguente è contenuta una descrizione dei file più importanti del progetto WfDefinition.

File Descrizione
IPurchaseProcessHost.cs Interfaccia per l'host del flusso di lavoro.
PurchaseProcessHost.cs Implementazione di un host per il flusso di lavoro. L'host estrae i dettagli dell'esecuzione del flusso di lavoro e viene usato in tutte le applicazioni client per caricare, eseguire e interagire con le istanze del flusso di lavoro PurchaseProcess.
PurchaseProcessWorkflow.cs Attività che contiene la definizione del flusso di lavoro del processo di acquisto (deriva dall'oggetto Activity).

Le attività che derivano da Activity compongono la funzionalità assemblando le attività personalizzate esistenti e le attività della libreria di attività di .NET Framework 4.6.1. L'assemblaggio di queste attività è il modo più comunemente usato per creare la funzionalità personalizzata.
WaitForVendorProposal.cs Questa attività personalizzata deriva dall'oggetto NativeActivity e crea un segnalibro denominato che deve essere ripreso in un secondo momento da un fornitore quando invia la proposta.

Le attività che derivano dalla classe NativeActivity, come quelle che derivano dalla classe CodeActivity creano la funzionalità imperativa eseguendo l'override del metodo Execute, ma dispongono anche dell'accesso a tutta la funzionalità del runtime del flusso di lavoro tramite la classe ActivityContext che viene passata al metodo Execute. Questo contesto dispone del supporto per la pianificazione e l'annullamento di attività figlio, per l'impostazione di zone di non persistenza (blocchi di esecuzione durante i quali il runtime non rende persistenti i dati del flusso di lavoro, ad esempio all'interno di transazioni atomiche), nonché per gli oggetti Bookmark (handle per la ripresa di flussi di lavoro sospesi).
TrackingParticipant.cs Oggetto TrackingParticipant che riceve tutti gli eventi di rilevamento e li salva in un file di testo.

I partecipanti del rilevamento vengono aggiunti all'istanza del flusso di lavoro come estensioni.
XmlWorkflowInstanceStore.cs Oggetto InstanceStore personalizzato che salva le applicazioni flusso di lavoro in file XML.
XmlPersistenceParticipant.cs Oggetto PersistenceParticipant personalizzato che salva un'istanza di richiesta di proposta in un file XML.
AsyncResult.cs/CompletedAsyncResult.cs Classi di supporto per l'implementazione del modello asincrono nei componenti della persistenza.

Comune

Nella tabella seguente è contenuta una descrizione delle classi più importanti del progetto Common.

Classe Descrizione
Fornitore Fornitore che invia proposte in una richiesta di proposte.
RequestForProposal Una richiesta di proposte (RDP) è un invito rivolto ai fornitori affinché inviino proposte per una merce o un servizio specifico.
VendorProposal Proposta inviata da un fornitore a una RDP concreta.
VendorRepository Repository di fornitori. Questa implementazione contiene una raccolta in memoria di istanze del fornitore e di metodi per esporre tali istanze.
RfpRepository Repository delle richieste di proposte. Questa implementazione usa Linq to XML per eseguire una query sul file XML di richieste di proposte generato dalla persistenza schematizzata.
IOHelper Questa classe gestisce tutti i problemi di I/O (cartelle, percorsi e così via).

Client Web

Nella tabella seguente è contenuta una descrizione delle pagine Web più importanti del progetto WebClient.

File Descrizione
CreateRfp.aspx Crea e invia una nuova richiesta di proposte.
Default.aspx Mostra tutte le richieste di proposte attive e completate.
GetVendorProposal.aspx Ottiene una proposta da un fornitore in una richiesta di proposte concreta. Questa pagina viene usata solo dai fornitori.
ShowRfp.aspx Mostra tutte le informazioni relative a una richiesta di proposte (proposte ricevute, date, valori e altre informazioni). Questa pagina viene usata solo dall'autore della richiesta di proposta.

WinFormsClient

Nella tabella seguente è contenuta una descrizione dei form più importanti del progetto WinFormsClient.

Modulo Descrizione
NewRfp Crea e invia una nuova richiesta di proposte.
ShowProposals Mostra tutte le richieste di proposte attive e completate. Nota: dopo aver creato o modificato una richiesta di proposta, potrebbe essere necessario fare clic sul pulsante Aggiorna nell'interfaccia utente per vedere le modifiche in tale schermata.
SubmitProposal Ottiene una proposta da un fornitore in una richiesta di proposte concreta. Questa finestra viene usata solo dai fornitori.
ViewRfp Mostra tutte le informazioni relative a una richiesta di proposte (proposte ricevute, date, valori e altre informazioni). Questa finestra viene usata solo dall'autore della richiesta di proposte.

File di persistenza

Nella tabella seguente vengono mostrati i file generati dal provider di persistenza (XmlPersistenceProvider) che si trovano nel percorso della cartella temporanea del sistema corrente (tramite il metodo GetTempPath). Il file di traccia viene creato nel percorso di esecuzione corrente.

Nome del file Descrizione Percorso
rfps.xml File XML con tutte le richieste di proposte attive e completate. GetTempPath
[instanceid] In questo file sono contenute tutte le informazioni su un'istanza del flusso di lavoro.

Questo file viene generato dall'implementazione della persistenza schematizzata (PersistenceParticipant in XmlPersistenceProvider).
GetTempPath
[instanceId].tracking File di testo con tutti gli eventi che si sono verificati all'interno di un'istanza concreta.

Questo file viene generato da TrackingParticipant.
GetTempPath
PurchaseProcess.Tracing.TraceLog.txt File di traccia generato dal flusso di lavoro in base ai parametri di configurazione dei file App.config o Web.config. Percorso di esecuzione corrente

Per usare questo esempio

  1. In Visual Studio aprire il file della soluzione PurchaseProcess.sln.

  2. Per eseguire il progetto WebClient, aprire Esplora soluzioni e fare clic con il pulsante destro del mouse sul progetto WebClient. Selezionare Imposta come progetto di avvio.

  3. Per eseguire il progetto WinFormsClient, aprire Esplora soluzioni e fare clic con il pulsante destro del mouse sul progetto WinFormsClient. Selezionare Imposta come progetto di avvio.

  4. Per compilare la soluzione, premere CTRL+MAIUSC+B.

  5. Per eseguire la soluzione, premere CTRL+F5.

Opzioni del progetto WebClient

  • Crea nuova RDP: crea una nuova richiesta di proposta (RDP) e avvia un flusso di lavoro del processo di acquisto.

  • Aggiorna: aggiorna l'elenco di RDP attive e completate nella finestra principale.

  • Visualizza: mostra il contenuto di una RDP esistente. I fornitori possono inviare le proposte (se invitati o se la RDP non è completata).

  • Visualizza come: l'utente può accedere alla RDP tramite diverse identità selezionando il partecipante desiderato nella casella combinata Visualizza come nella griglia di RDP attive.

Opzioni del progetto WinFormsClient

  • Crea RDP: crea una nuova richiesta di proposta (RDP) e avvia un flusso di lavoro del processo di acquisto.

  • Aggiorna: aggiorna l'elenco di RDP attive e completate nella finestra principale.

  • Visualizza RDP: mostra il contenuto di una RDP esistente. I fornitori possono inviare le proposte (se invitati o se la RDP non è completata)

  • Connetti come: l'utente può accedere alla RDP tramite diverse identità selezionando il partecipante desiderato nella casella combinata Visualizza come nella griglia di RDP attive.