Processo di assunzione
L'esempio HiringProcess illustra come implementare un processo aziendale tramite attività di messaggistica e due flussi di lavoro ospitati come servizi flusso di lavoro. e appartenenti all'infrastruttura IT di una società fittizia denominata Contoso, Inc.
Il processo del flusso di lavoro HiringRequest
, implementato come un oggetto Flowchart, chiede l'autorizzazione a diversi responsabili nell'organizzazione. Per raggiungere questo obiettivo, il flusso di lavoro usa altri servizi esistenti nell'organizzazione, in questo caso un servizio di posta in arrivo e un servizio dati dell'organizzazione implementati come semplici servizi di Windows Communication Foundation (WCF).
Il flusso di lavoro ResumeRequest
, implementato come un oggetto Sequence, pubblica un elenco di offerte di lavoro nel sito Web esterno delle carriere di Contoso e gestisce l'acquisizione dei curriculum. Tale elenco è disponibile nel sito Web esterno per un periodo fisso di tempo, ovvero fino alla scadenza di un timeout, o fino a quando un dipendente di Contoso non decide di rimuoverlo.
Questo esempio illustra le funzionalità di .NET Framework 4.6.1 seguenti:
Flussi di lavoro Flowchart e Sequence per modellare processi aziendali
Servizi flusso di lavoro
Attività di messaggistica
Correlazione basata sul contenuto
Attività personalizzate (dichiarative e basate sul codice)
Persistenza di SQL Server fornita dal sistema
Oggetto PersistenceParticipant personalizzato
Rilevamento personalizzato
Rilevamento ETW (Event Tracking for Windows)
Composizione di attività
Attività Parallel
Attività CancellationScope
Timer durevoli (attività Delay)
Transazioni.
Uso di più di un flusso di lavoro nella stessa soluzione
Descrizione del processo
Contoso, Inc. desidera avere stretto controllo sul personale presente in ciascun reparto. Di conseguenza, tutte le volte che un dipendente desidera avviare un nuovo processo di assunzione deve passare attraverso un'approvazione del processo di richiesta di assunzione prima che la selezione possa effettivamente avere luogo. Tale processo è denominato richiesta del processo di assunzione (definito nel progetto HiringRequestService) ed è costituito dai passaggi seguenti.
Un dipendente (il richiedente) avvia la richiesta del processo di assunzione.
Il responsabile del richiedente deve approvare la richiesta:
Il responsabile può rifiutare la richiesta.
Il responsabile può restituire la richiesta al richiedente per ottenere informazioni aggiuntive.
- Il richiedente rivede la richiesta e la invia nuovamente al responsabile.
Il responsabile può approvare la richiesta.
Dopo che il responsabile del richiedente ha concesso l'approvazione, la richiesta deve essere approvata dal responsabile del reparto:
Il responsabile del reparto può rifiutare la richiesta.
Il responsabile del reparto può approvare la richiesta.
Dopo che il responsabile del reparto ha concesso l'approvazione, è necessaria l'approvazione di 2 responsabili delle risorse umane o del CEO.
Il processo può passare allo stato accettato o rifiutato.
Se il processo viene accettato, verrà avviata una nuova istanza del flusso di lavoro
ResumeRequest
(ResumeRequest
è collegato a HiringRequest.csproj tramite un riferimento al servizio.)
Dopo che i responsabili hanno approvato l'assunzione di un nuovo dipendente, il reparto risorse umane deve individuare il candidato adatto. Questo processo viene eseguito dal secondo flusso di lavoro (ResumeRequest
, definito in ResumeRequestService.csproj). Tale flusso di lavoro definisce il processo per l'invio di un elenco di offerte di lavoro con un'opportunità di carriera al sito Web esterno delle carriere di Contoso, riceve i curriculum dei candidati ed esamina lo stato dell'elenco. Le posizioni sono disponibili per un periodo fisso di tempo, ovvero fino a una scadenza predeterminata, o fino a quando un dipendente di Contoso non decide di rimuoverle. Il flusso di lavoro ResumeRequest
è costituito dai passaggi seguenti.
Un dipendente di Contoso inserisce le informazioni sulla posizione e una durata del timeout. Dopo che il dipendente ha inserito tali informazioni, la posizione viene pubblicata nel sito Web delle carriere.
Dopo la pubblicazione delle informazioni, le parti interessate possono inviare il curriculum che viene archiviato in un record collegato all'apertura della pratica.
I candidati possono inviare il proprio curriculum fino alla scadenza del timeout o fino a quando un appartenente al reparto risorse umane di Contoso non decide in modo esplicito di rimuovere l'elenco arrestando il processo.
Progetti presenti nell'esempio
Nella tabella seguente vengono illustrati i progetti presenti nella soluzione di esempio.
Project | Descrizione |
---|---|
ContosoHR | Contiene contratti di dati, oggetti business e classi del repository. |
HiringRequestService | Contiene la definizione del flusso di lavoro relativo al processo di richiesta di assunzione. Il progetto viene implementato come un'applicazione console che ospita in modalità self-hosting il flusso di lavoro (file con estensione xaml) come un servizio. |
ResumeRequestService | Servizio flusso di lavoro che raccoglie i curriculum dei candidati fino alla scadenza di un timeout o fino a quando qualcuno non decide che il processo deve essere arrestato. Il progetto viene implementato come un servizio flusso di lavoro dichiarativo (file con estensione xamlx). |
OrgService | Servizio che espone informazioni organizzative (dipendenti, posizioni, tipi di posizioni e reparti). Questo servizio può essere paragonato al modulo di organizzazione dell'azienda di una pianificazione ERP (Enterprise Resource Plan). Il progetto viene implementato come applicazione console che espone un servizio Windows Communication Foundation (WCF). |
InboxService | Casella di posta in arrivo che contiene attività in base alle quali i dipendenti intraprendono un'azione. Il progetto viene implementato come un'applicazione console che espone un servizio WCF. |
InternalClient | Applicazione Web per l'interazione con il processo. Gli utenti possono avviare e visualizzare i propri flussi di lavoro HiringProcess nonché parteciparvi. Grazie a questa applicazione, possono inoltre avviare e monitorare i processi ResumeRequest. Questo sito viene implementato in modo che sia interno alla rete Intranet di Contoso, mentre il progetto viene implementato come un sito Web ASP.NET. |
CareersWebSite | Sito Web esterno che espone le posizioni aperte in Contoso. Qualsiasi candidato potenziale può spostarsi in questo sito e inviare un curriculum. |
Riepilogo funzionalità
Nella tabella seguente vengono descritte le modalità di utilizzo di ogni funzionalità nell'esempio.
Funzionalità | Descrizione | Project |
---|---|---|
Diagramma di flusso | Il processo aziendale viene rappresentato come un diagramma di flusso la cui descrizione rappresenta il processo in modo analogo a quello in cui un'azienda l'avrebbe riportato su una lavagna. | HiringRequestService |
Servizi flusso di lavoro | Il diagramma di flusso con la definizione del processo è ospitato in un servizio (in questo esempio il servizio è ospitato in un'applicazione console). | HiringRequestService |
Attività di messaggistica | Il diagramma di flusso usa le attività di messaggistica per gli scopi seguenti: - Recupero di informazioni dall'utente (per ricevere le decisioni e le informazioni correlate in ogni passaggio del processo di approvazione). - Interazione con gli altri servizi esistenti (InboxService e OrgDataService, usati tramite riferimenti al servizio). |
HiringRequestService |
Correlazione basata sul contenuto | I messaggi di approvazione sono correlati alla proprietà ID della richiesta di assunzione: - Quando un processo viene avviato, l'handle di correlazione viene inizializzato con l'ID della richiesta. - I messaggi di approvazione in ingresso sono correlati al relativo ID (il primo parametro di ogni messaggio di approvazione è l'ID della richiesta). |
HiringRequestService / ResumeRequestService |
Attività personalizzate (dichiarative e basate sul codice) | Nell'esempio sono presenti diverse attività personalizzate: - SaveActionTracking : questa attività genera un oggetto TrackingRecord personalizzato (tramite Track). L'attività è stata creata usando codice imperativo che estende NativeActivity.- GetEmployeesByPositionTypes : questa attività riceve un elenco di ID di tipi di posizione e restituisce un elenco di persone con tale posizione in Contoso. L'attività è stata creata in modo dichiarativo (usando la finestra di progettazione delle attività).- SaveHiringRequestInfo : questa attività salva le informazioni di un processo HiringRequest (tramite HiringRequestRepository.Save ). L'attività è stata creata usando codice imperativo che estende CodeActivity. |
HiringRequestService |
Persistenza di SQL Server fornita dal sistema | L'istanza di WorkflowServiceHost che ospita la definizione del processo del diagramma di flusso è configurata per usare la persistenza di SQL Server fornita dal sistema. | HiringRequestService / ResumeRequestService |
Rilevamento personalizzato | Nell'esempio è incluso un partecipante del rilevamento personalizzato che salva la cronologia di un processo HiringRequestProcess (quest'ultimo registra l'azione eseguita nonché l'autore e il momento dell'esecuzione). Il codice sorgente si trova nella cartella Tracking di HiringRequestService. |
HiringRequestService |
Rilevamento ETW | Il rilevamento ETW fornito dal sistema viene configurato nel file App.config nel servizio HiringRequestService. | HiringRequestService |
Composizione di attività | La definizione del processo usa la composizione libera di Activity. Il diagramma di flusso contiene diverse attività Sequence e Parallel che a loro volta ne contengono altre e così via. | HiringRequestService |
Attività parallele | - ParallelForEach<T> viene usato per effettuare la registrazione in parallelo nella casella di posta in arrivo del CEO e dei responsabili delle risorse umane (in attesa dell'approvazione dei due responsabili). - Parallel viene usato per eseguire alcune attività di pulizia nei passaggi di completamento e rifiuto. |
HiringRequestService |
Annullamento del modello | Nel diagramma di flusso viene usato CancellationScope per applicare l'annullamento (in questo caso eseguendo attività di pulizia). | HiringRequestService |
Partecipante di persistenza personalizzato | HiringRequestPersistenceParticipant salva i dati da una variabile del flusso di lavoro in una tabella archiviata nel database delle risorse umane di Contoso. |
HiringRequestService |
Servizi flusso di lavoro | ResumeRequestService viene implementato usando servizi flusso di lavoro. La definizione del flusso di lavoro e le informazioni sul servizio sono contenute nel file ResumeRequestService.xamlx. Il servizio è configurato per usare la persistenza e il rilevamento. |
ResumeRequestService |
Timer durevoli | In ResumeRequestService vengono usati timer durevoli per definire la durata di un elenco di offerte di lavoro (quando un timeout scade, le offerte vengono chiuse). |
ResumeRequestService |
Transazioni | TransactionScope viene usato per garantire la coerenza dei dati durante l'esecuzione di diverse attività (quando viene ricevuto un nuovo curriculum). | ResumeRequestService |
Transazioni | Il partecipante di persistenza (HiringRequestPersistenceParticipant ) e il partecipante del rilevamento personalizzati (HistoryFileTrackingParticipant ) usano la stessa transazione. |
HiringRequestService |
Uso di Windows Workflow Foundation in applicazioni ASP.NET | L'accesso ai flussi di lavoro viene eseguito da due applicazioni ASP.NET. | InternalClient / CareersWebSite |
Archiviazione dati
I dati vengono archiviati in un database di SQL Server denominato ContosoHR
(lo script per la creazione di questo database si trova nella cartella DbSetup
), Le istanze di flusso di lavoro vengono archiviate in un database di SQL Server denominato InstanceStore
(gli script per la creazione dell'archivio di istanze sono parte della distribuzione di .NET Framework 4.6.1).
Entrambi i database vengono creati eseguendo lo script Setup.cmd da un prompt dei comandi per gli sviluppatori per Visual Studio.
Esecuzione dell'esempio
Per creare i database
Aprire un prompt dei comandi per gli sviluppatori per Visual Studio.
Passare alla cartella dell'esempio.
Eseguire Setup.cmd.
Verificare che i due database
ContosoHR
eInstanceStore
siano creati in SQL Express.
Per configurare la soluzione per l'esecuzione
Eseguire Visual Studio come amministratore. Aprire HiringRequest.sln.
In Esplora soluzioni fare clic con il pulsante destro del mouse sulla soluzione e scegliere Proprietà.
Selezionare l'opzione Progetti di avvio multipli, quindi impostare CareersWebSite, InternalClient, HiringRequestService e ResumeRequestService su Start. Lasciare ContosoHR, InboxService e OrgService impostati su None.
Premere CTRL+MAIUSC+B per compilare la soluzione, quindi verificare che la compilazione sia stata eseguita in modo corretto.
Per eseguire la soluzione
Dopo che la soluzione è stata compilata, premere CTRL+F5 per eseguirla senza debug. Verificare che tutti i servizi siano stati avviati.
Nella soluzione fare clic con il pulsante destro del mouse su InternalClient e scegliere Visualizza nel browser. Verrà visualizzata la pagina predefinita per
InternalClient
. Verificare che i servizi siano in esecuzione, quindi fare clic sul collegamento.Viene visualizzato il modulo HiringRequest. È possibile seguire lo scenario descritto in questo punto.
Una volta che
HiringRequest
è completo, è possibile avviareResumeRequest
. È possibile seguire lo scenario descritto in questo punto.Quando
ResumeRequest
viene pubblicato, sarà disponibile nel sito Web pubblico (sito Web delle carriere di Contoso). Per visualizzare l'elenco delle offerte di lavoro e candidarsi per la posizione, spostarsi su tale sito.Nella soluzione fare clic con il pulsante destro del mouse su CareersWebSite e scegliere Visualizza nel browser.
Nella soluzione fare clic con il pulsante destro del mouse su InternalClient e scegliere Visualizza nel browser per spostarsi di nuovo in
InternalClient
.Passare alla sezione JobPostings facendo clic sul collegamento relativo all'elenco di offerte di lavoro nel menu superiore della casella di posta in arrivo. È possibile seguire lo scenario descritto in questo punto.
Scenari
Richiesta di assunzione
Michael Alexander (programmatore) desidera richiedere una nuova posizione per assumere un esperto in testing (SDET) nel reparto tecnico con almeno tre anni di esperienza nel linguaggio di programmazione C#.
Dopo la creazione, la richiesta viene visualizzata nella casella di posta in arrivo di Michael (fare clic su Aggiorna se non viene visualizzata) in attesa dell'approvazione di Peter Brehm, responsabile di Michael.
Peter vuole gestire la richiesta di Michael. poiché ritiene che la posizione richieda 5 anni di esperienza nel linguaggio C# anziché 3 e pertanto invia i propri commenti per la revisione.
Michael riceve un messaggio proveniente dal responsabile nella casella di posta in arrivo e vuole intervenire. Dopo aver esaminato la cronologia della richiesta di posizione, concorda con Peter. Michael modifica pertanto la descrizione per richiedere 5 anni di esperienza nel linguaggio C# e accetta la modifica.
Peter interviene sulla richiesta modificata di Michael e l'accetta. A questo punto la richiesta deve essere approvata dal direttore del reparto tecnico, Tsvi Reiter.
Tsvi Reiter desidera accelerare la richiesta, pertanto inserisce un commento per indicare che la richiesta è urgente e l'accetta.
La richiesta deve ora essere approvata da due responsabili delle risorse umane o dal CEO. Quest'ultimo, Brian Richard Goldstein, vede la richiesta urgente di Tsvi e interviene accettandola, precedendo l'approvazione dei due responsabili delle risorse umane.
La richiesta viene rimossa dalla casella di posta in arrivo di Michael e il processo di assunzione di un esperto SDET è così avviato.
Avviare la richiesta di curriculum
A questo punto la posizione lavorativa è in attesa di essere pubblicata in un sito Web esterno a cui le persone possono inviare le candidature. Per visualizzarlo, fare clic sul collegamento relativo all'elenco di offerte di lavoro. Attualmente, la posizione lavorativa deve essere completata da un addetto delle risorse umane responsabile della finalizzazione e della pubblicazione della posizione.
Il reparto risorse umane vuole modificare la posizione lavorativa (tramite il collegamento Modifica) impostando un timeout di 60 minuti (in uno scenario reale questo valore potrebbe essere rappresentato da giorni o settimane). Il timeout consente che la posizione lavorativa venga eliminata dal sito Web esterno dopo il tempo specificato.
Dopo che è stata modificata e salvata, la posizione lavorativa viene visualizzata nella scheda relativa alla ricezione dei curriculum (aggiornare la pagina Web per visualizzarla).
Raccolta di curriculum
La posizione lavorativa dovrebbe essere visualizzata sul sito Web esterno. Una persona interessata può pertanto candidarsi per la posizione e inviare il proprio curriculum.
Se si torna al servizio relativo all'elenco di offerte di lavoro, è possibile visualizzare i curriculum raccolti fino al momento attuale.
Il reparto risorse umane può decidere di interrompere la raccolta, ad esempio se il candidato appropriato è stato identificato.
Risoluzione dei problemi
Accertarsi di eseguire Visual Studio con privilegi di amministratore.
Se non è possibile compilare la soluzione, verificare l'elemento seguente:
- Il riferimento a
ContosoHR
non deve mancare nel progettoInternalClient
oCareersWebSite
.
- Il riferimento a
Se non è possibile eseguire la soluzione, verificare gli elementi seguenti:
Tutti i servizi sono in esecuzione.
I riferimenti al servizio sono aggiornati.
Aprire la cartella App_WebReferences.
Fare clic con il pulsante destro del mouse su Contoso, quindi scegliere Aggiorna riferimenti Web/al servizio.
Premere CTRL+MAIUSC+B per ricompilare la soluzione in Visual Studio.
Disinstallazione
Eliminare l'archivio dell'istanza di SQL Server eseguendo Cleanup.bat, disponibile nella cartella DbSetup.
Eliminare il codice sorgente dal disco rigido.