Programmazione.it v6.4
Ciao, per farti riconoscere devi fare il login. Non ti sei ancora iscritto? Che aspetti, registrati adesso!
Info Pubblicità Collabora Autori Sottoscrizioni Preferiti Bozze Scheda personale Privacy Archivio Libri Corsi per principianti Forum
Simulare un operatore di call center con Windows Workflow Foundation (6/7)
Scritto da Fabio Carucci il 14-10-2008 ore 07:35
Intel Parallel Studio XE
Siamo giunti al livello presentation. Creiamo un nuovo progetto di tipo Windows Application e lo chiamiamo SimWFCallCenterPresentation, aggiungiamo i riferimenti ai nostri due progetti SimWFCallCenterActivityInterface e SimWFCallCenterWorkflow e ai soliti System.Workflow.Activities, System.Workflow.ComponentModel, System.Workflow.Runtime. Creiamo poi una windows form e chiamiamola frmPresentation; per brevità allego l’immagine di ciò che contiene visivamente al suo interno:

<img src="http://farm4.static.flickr.com/3280/2935391150_5125db7b9c_o.png" width="390" height="374" alt="AppFormCurrent05" />

Nel code-behind, nella sezione using, inseriamo:
  1. <span style="font-size:1.0em">
  2. using System.Workflow.Runtime;
  3. using System.Workflow.Activities; 
  4. </span>
e nella partial class della form:
  1. <span style="font-size:1.0em">
  2. private WorkflowRuntime wfRuntime;
  3. private SimWFCallCenterActivityInterface.CallCenterService callCenterService;
  4. private StateMachineWorkflowInstance stateMachineInstance;
  5. </span>
La prima dichiarazione è relativa al runtime di WF, la seconda è alla nostra classe di servizio pubblico e la terza è l’istanza di un workflow di tipo “macchina a stati”.
A seguire inseriamo i seguenti delegate:
  1. <span style="font-size:1.0em">
  2. private delegate void UpdateMenuItemDelegate(WorkflowInstance wfInstance, string wfState, string wfStatus);
  3. private delegate void UpdateButtonStatusDelegate();
  4. private delegate void UpdateMenuTextDelegate(object sender, SimWFCallCenterActivityInterface.UpdateMenuEventArgs e);
  5. </span>
Il primo si occuperà di aggiornare i contenuti del menu di navigazione, il secondo aggiornerà lo stato dei pulsanti, che saranno quindi sensibili al contesto, e il terzo aggiornerà i contenuti degli argomenti selezionati. Ora aggiungiamo la seguente property, che ci servirà per passare il testo giusto alla RichTextBox, che rappresenta l’area di lettura dei menu; rtbDisplay è la RichTextBox:
  1. <span style="font-size:1.0em">
  2. public string Dialogs
  3.         {
  4.             get
  5.             {
  6.                 return this.rtbDisplay.Text;
  7.             }
  8.             set
  9.             {
  10.                 this.rtbDisplay.Text = value;
  11.             }
  12.         }
  13. </span>
Creiamo finalmente il metodo, che farà partire il runtime di WF impostato con i servizi del nostro workflow (i commenti nel codice sono esplicativi):
  1. <span style="font-size:1.0em">
  2. private void StartWorkFlow()
  3.         {
  4.             // Crea una nuova istanza del workflow runtime
  5.             wfRuntime = new WorkflowRuntime();
  6.  
  7.             // Crea gli eventhandlers per il runtime
  8.             wfRuntime.WorkflowTerminated += new EventHandler(wfRuntime_WorkflowTerminated);
  9.             wfRuntime.WorkflowCompleted += new EventHandler(wfRuntime_WorkflowCompleted);
  10.             wfRuntime.WorkflowIdled += new EventHandler(wfRuntime_WorkflowIdled);
  11.  
  12.             // Esegue il servizio
  13.             wfRuntime.StartRuntime();
  14.  
  15.             // Aggiunge una instanza dell' External Data Exchange Service
  16.             ExternalDataExchangeService extDataExchangeService = new ExternalDataExchangeService();
  17.             wfRuntime.AddService(extDataExchangeService);
  18.  
  19.             // Aggiunge una nuova istanza del callcenterService al servizio external data exchange
  20.             callCenterService = new SimWFCallCenterActivityInterface.CallCenterService();
  21.             extDataExchangeService.AddService(callCenterService);
  22.  
  23.             callCenterService.MenuChangedEventHandler +=new SimWFCallCenterActivityInterface.CallCenterService.UpdateMenuEventHandler(callCenterService_MenuChangedEventHandler);
  24.         }
  25. </span>
e implementiamo il metodo StartCallCenterWorkflow(), che creerà una istanza del nostro workflow di tipo StateMachineWorkflow:
  1. <span style="font-size:1.0em">
  2. private StateMachineWorkflowInstance StartCallCenterWorkflow()
  3.         {
  4.             WorkflowInstance wi = this.wfRuntime.CreateWorkflow(typeof(SimWFCallCenterWorkflow.CallCenterWorkflow));
  5.             wi.Start();
  6.             return new StateMachineWorkflowInstance(this.wfRuntime, wi.InstanceId);
  7.         }
  8. </span>
Ora facciamo doppio clic sul pulsante Inizia Sessione e inseriamo il seguente codice nell’evento del clic:
  1. <span style="font-size:1.0em">
  2. private void butStart_Click(object sender, EventArgs e)
  3.         {
  4.             stateMachineInstance = this.StartCallCenterWorkflow();
  5.         }
  6. </span>
Creiamo un evento clic, che assoceremo a tutti i pulsanti di selezione menu:
  1. <span style="font-size:1.0em">
  2. private void butSingle_Click(object sender, EventArgs e)
  3.         {            
  4.             string name = ((Button)sender).Name;
  5.             this.DisableBut();
  6.             callCenterService.RaiseMenuItemSelected(new SimWFCallCenterActivityInterface.CallCenterEventArgs(stateMachineInstance.InstanceId, name));
  7.         }
  8. </span>
DisableBut() è un metodo che imposta disabilita tutti i pulsanti di selezione.
Precedente: Il funzionamento di NSIS
Successiva: Servizi di storage online: una breve analisi (2/3)
Copyright Programmazione.it™ 1999-2013. Alcuni diritti riservati. Testata giornalistica iscritta col n. 569 presso il Tribunale di Milano in data 14/10/2002. Pagina generata in 0.3 secondi.