Windows Workflow Foundation Part III

Di seri yang ketiga dari seri WWF blog ini, saya akan membahas tentang StateMachineWorkflow dengan menggambarkan sebuah contoh yang berkaitan dengan tema ini. Yang membedakan antara 2 type workflow yaitu Sequential Workflow (Lihat posting sebelumnya) dengan StateMachine adalah StateMachine bekerja berdasarkan event response dari sebuah perubahan yang dimiliki oleh sebuah proses. Sampai kapanpun dia akan menunggu perubahan status dari sebuah proses untuk berpindah ke proses berikut-nya.

WF2

Seperti gambaran di atas, sebelum tombol power ditekan state masih dalam keadaan mati hingga Button di click, pada saat button di click status dalam keadaan hidup. Perubahan antara hidup dan mati-nya tombol tadi itu yang disebut sebagai Transition. Begitu juga ketika tombol ditekan lagi maka proses-nya akan berlaku seperti kebalikannya.

Untuk gambaran kali ini saya akan memberikan contoh tentang proses pengajuan cuti melewati sebuah proses statemachine workflow yang sederhana. Ada 3 state yang akan berlangsung dalam proses workflow ini :

  • WaitingForLeave (menunggu proses pengajuan cuti)
  • LeaveProcessing (pemrosesan cuti)
  • LeaveCompleted (pengajuan proses cuti selesai)

 

State Event State Transition
WaitingForLeave LeaveRequest LeaveProcessing
LeaveProcessing LeaveReject LeaveCompleted
LeaveProcessing LeaveApproved LeaveCompleted

 

Tahapan pertama adalah membuat project baru dari language C# kemudian pilih StateMachineConsoleApplication Template.

  1. Beri nama Project SimpleStateMachineWF
  2. Kemudian akan muncul sebuah StateMachineWorkflow Designer dialog seperti ini, dan diberi nama LeaveWorkflow sebagai pengganti nama WorkFlow1
  3. Masukan 3 buah state seperti table di atas kemudian beri nama sesuai dengan nama state-nya.

WF3

 

Membuat Interface Penghubung antara Workflow dengan Host Application

Untuk memulai sebuah proses pembuatan workflow, sebaiknya kita mengikuti best practise untuk pembuatan event-nya dengan membuat sebuah Interface yang di dalamnya ada event-event yang sudah didesain sebelum-nya beserta satu buah class untuk passing data antara Host Application dengan StateMachine Workflow-nya. Ini akan saya gabungkan dalam 1 buah file LeaveService.cs yang ditambahkan ke dalam project dengan menambahkan sebuah class item baru.

  1. Buat sebuah class file baru dengan cara add new class item baru, kemudian berinama leaveService
  2. Buat Interface baru dengan menyelipkan sebelum definisi Inteface antara namespace dengan class LeaveService, seperti dalam coding berikut :

    1 using System;

    2 using System.Text;

    3 using System.Workflow.ComponentModel.Compiler;

    4 using System.Workflow.ComponentModel.Serialization;

    5 using System.Workflow.ComponentModel;

    6 using System.Workflow.ComponentModel.Design;

    7 using System.Workflow.Runtime;

    8 using System.Workflow.Activities;

    9 using System.Workflow.Activities.Rules;

   10 

   11 namespace SimpleStateMachineWF

   12 {

   13     [ExternalDataExchange]

   14     public interface ILeaveService

   15     {

   16         event EventHandler<ExternalDataEventArgs> LeaveRequest;

   17         event EventHandler<ExternalDataEventArgs> LeaveReject;

   18         event EventHandler<ExternalDataEventArgs> LeaveApproved;

   19         void OnSendMessage(Guid LeaveItemID,string EmployeeName, int days,string Message);

   20 

   21     }

    3.    Buat Class yang merupakan turunan dari ExternalDataEventArgs, nantinya akan dikirim sebagai bagian parameter yang akan dipakai oleh setiap event-           event yang sudah ada seperti tabel di atas

   22 

   23 

   24     [Serializable]

   25     public class MessageReceivedEventArgs : ExternalDataEventArgs

   26     {

   27         private Guid LeaveItemID;

   28         private string EmployeeName;

   29         private int numberOfdays;

   30         private string message;

   31 

   32         public string Message

   33         {

   34             get { return message; }

   35             set { message = value; }

   36         }

   37         public Guid LeaveItem

   38         {

   39             get { return LeaveItemID; }

   40             set{LeaveItemID = value;}

   41         }

   42 

   43         public string employee

   44         {

   45             get { return EmployeeName; }

   46             set { EmployeeName = value; }

   47         }

   48 

   49         public int days

   50         {

   51             get { return numberOfdays; }

   52             set { numberOfdays = value; }

   53         }

   54 

   55         public MessageReceivedEventArgs(Guid LeaveItem, string employee, int days,string message)

   56             : base(LeaveItem)

   57         {

   58             this.LeaveItemID = LeaveItem;

   59             this.EmployeeName = employee;

   60             this.numberOfdays = days;

   61             this.Message = message;

   62         }

   63     }

    4.    Kemudian buat kembali sebuah class baru yang meng-implement ILeaveInterface

   64     public class LeaveService : ILeaveService

   65     {

   66         #region ILeaveService Members

   67 

   68         public event EventHandler<ExternalDataEventArgs> LeaveRequest;

   69 

   70         public event EventHandler<ExternalDataEventArgs> LeaveReject;

   71 

   72         public event EventHandler<ExternalDataEventArgs> LeaveApproved;

   73 

   74         public void OnSendMessage(Guid LeaveItemID, string EmployeeName, int days,string message)

   75         {

   76             if (MessageReceived != null)

   77             {

   78                 MessageReceivedEventArgs args = new MessageReceivedEventArgs(LeaveItemID, EmployeeName, days,message);

   79                 MessageReceived(this, args);

   80             }

   81         }

   82         #endregion

   83 

   84         public event EventHandler<MessageReceivedEventArgs> MessageReceived;

   85 

   86         public void onLeaveRequest(ExternalDataEventArgs args)

   87         {

   88             if (LeaveRequest != null)

   89             {

   90                 LeaveRequest(null, args);

   91             }

   92         }

   93         public void onLeaveReject(ExternalDataEventArgs args)

   94         {

   95             if (LeaveReject != null)

   96             {

   97                 LeaveReject(null, args);

   98             }

   99         }

  100         public void onLeaveApproved(ExternalDataEventArgs args)

  101         {

  102             if (LeaveApproved != null)

  103             {

  104                 LeaveApproved(null, args);

  105             }

  106         }

  107 

  108     }

  109 }

 

     5.    Kembali lagi ke Workflow designer, saatnya kita untuk membuat visualisasi berdasarkan tabel state machine sebelumnya.

     6.    Dari State WaitingForLeave klik kanan dan klik Event Actity hingga muncul tampilan seperti ini :

 

WF4

 

     7.    tambahkan dari toolbox secara berurutan handlingExternalEvent,CallExternalMethod,SetState

wf5

 

 

      8.   Rubah property dari handleExternalEventActivity menjadi :

            -  Interface Type ke : ILeaveInterface

            -  EventName : LeaveRequest

            Kemudian yang callExternalMethodActivity menjadi :

            -  InterfaceType : ILeaveInterface

            -  MethodName : onSendMessage

            SetStateActivity :

            -  TargetStateName : LeaveProcessing

 

       9.   Kemudian berulang utk 2 state yang lainnya sehingga menjadi seperti ini :

 

              WF6

 

 

Sampai sini tahapan pembuatan workflow sudah selesai dibuat, tinggal selanjutnya bagaimana kita memanggil dari host application, tunggu dalam tulisan berikut-nya yah..
dah cape.. juga nih (itung-itung ngabuburit).

 

 

 

 

 

 

 

Published Sunday, September 28, 2008 3:20 PM by sony
Filed under: ,