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.
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.
- Beri nama Project SimpleStateMachineWF
- Kemudian akan muncul sebuah StateMachineWorkflow Designer dialog seperti ini, dan diberi nama LeaveWorkflow sebagai pengganti nama WorkFlow1
- Masukan 3 buah state seperti table di atas kemudian beri nama sesuai dengan nama state-nya.
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.
- Buat sebuah class file baru dengan cara add new class item baru, kemudian berinama leaveService
- 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 :
7. tambahkan dari toolbox secara berurutan handlingExternalEvent,CallExternalMethod,SetState
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 :
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).