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.
Un dipendente della società X crea una richiesta di proposta (RDP).
Il dipendente digita il titolo e la descrizione della RDP.
Il dipendente seleziona i fornitori a cui vuole richiedere di inviare proposte.
Il dipendente invia la proposta.
Viene creata un'istanza del flusso di lavoro.
Il flusso di lavoro attende che tutti i fornitori inviino le proposte.
Una volta ricevute tutte le proposte, il flusso di lavoro scorre tutte le proposte ricevute e seleziona la migliore.
A ogni fornitore è assegnata una valutazione (in questo esempio l'elenco di valutazioni viene archiviato in VendorRepository.cs).
Il valore totale della proposta è determinato da (valore digitato dal fornitore) * (valutazione registrata del fornitore) / 100.
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
In Visual Studio aprire il file della soluzione PurchaseProcess.sln.
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.
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.
Per compilare la soluzione, premere CTRL+MAIUSC+B.
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.