Realizzare workflow a stati con Windows Workflow Foundation

5 pagine in totale: <<Indietro 1 2 [3] 4 5 Avanti >>

Come parlano il workflow e l'applicazione host?

Il sistema di comunicazione che c'è tra ogni istanza del workflow e l'applicazione che funge da host è basato sull'utilizzo di servizi di comunicazioni locali, che vengono inseriti nel runtime di WF prima che questo sia fatto partire.

Questi servizi di data exchange funzionano attraverso la definizione di specifiche interfacce che definiscono l'insieme di eventi che l'applicazione host può scatenare e che il workflow ascolta. Tali interfacce devono essere marcate tramite l'attributo ExternalDataExchange.
Per permettere quindi tale comunicazione, abbiamo bisogno di sviluppare un interfaccia che definisca gli eventi di inserimento, modifica, rimozione e completamento dell'ordine, una classe che implementi tale interfaccia e una classe che definisca gli argomenti da passare ad ogni evento, in modo tale da creare un livello di astrazione in grado di far dialogare l'host con il workflow.

namespace ShoppingCartWorkflow.Events
{
    [ExternalDataExchange]
    public interface IShoppingCartService
    {
        event EventHandler ItemInserted;
        event EventHandler ItemModified;
        event EventHandler ItemRemoved;
        event EventHandler ItemPurchased;
    }

    public class ShoppingCartService : IShoppingCartService
    {
        public event EventHandler ItemInserted;
        public event EventHandler ItemModified;
        public event EventHandler ItemRemoved;
        public event EventHandler ItemPurchased;

                                                                                                                                                public void InsertItem(Guid id, ShoppingCartItem item)
        {
                            if (ItemInserted != null)
                ItemInserted(null, new ItemStateChangedEventArgs(id, item));
        }

                        public void ModifyItem(Guid id, ShoppingCartItem item)
        {
                            if (ItemModified != null)
                ItemModified(null, new ItemStateChangedEventArgs(id, item));
        }

                        public void RemoveItem(Guid id, ShoppingCartItem item)
        {
                            if (ItemRemoved != null)
                ItemRemoved(null, new ItemStateChangedEventArgs(id, item));
        }

                        public void PurchaseItem(Guid id, ShoppingCartItem item)
        {
                            if (ItemPurchased != null)
                ItemPurchased(null, new ItemStateChangedEventArgs(id, item));
        }
    }

                            [Serializable]
    public class ItemStateChangedEventArgs : ExternalDataEventArgs
    {
                private ShoppingCartItem item;

        public ItemStateChangedEventArgs(Guid instanceID, ShoppingCartItem item)
            : base(instanceID)
        {
                            this.item = item;
            WaitForIdle = true;
        }

                        public ShoppingCartItem Item
        {
                            get { return item; }
            set { item = value; }
        }
    }
}

E' importante notare che la classe dedita a definire gli argomenti dei nostri eventi personalizzati, deve essere marcata con l'attributo Serializable in quanto questi sono oggetti che verranno poi passati da un livello all'altro del sistema di comunicazione, e proprio in questo passaggio vengono serializzati dal runtime. Questa classe, inoltre, si prende carico di passare le informazioni sul prodotto scelto prendendo come parametro un oggetto di tipo ShoppingCartItem, da noi definito, per rappresentare un singolo prodotto del nostro carrello della spesa.

Senza la specifica di questa interfaccia di servizio, sarebbe impossibile far dialogare l'applicazione host con il workflow e scatenare tutti gli eventi utili a far saltare di stato il flusso di operazioni corrente.

Una volta definita questa interfaccia, possiamo continuare lo sviluppo del nostro workflow andando ad inserire nelle attività di tipo HandleExternalEventActivity, il tipo di interfaccia che gli permette di dialogare con il servizio di comunicazione (proprietà InterfaceType) e il tipo di evento cui dovranno rispondere (proprietà EventName).

Le proprietà di un'activity di tipo HandlerExternalEventActivity

5 pagine in totale: <<Indietro 1 2 [3] 4 5 Avanti >>

Attenzione: Questo articolo contiene un allegato

Contenuti dell'articolo

Commenti
Dai un voto a questo articolo, ci aiuterà a migliorare il nostro sito (1 è il voto minimo, 5 il massimo).

Per procedere al rating dell'articolo devi essere autenticato.

Aggiungi un nuovo commento »»»
Per inserire un commento, devi registrarti alla nostra community.



TUTORIALS


IN EVIDENZA
MISC