Passing Data antara Host dan Workflow - Bagian 1

Sebelum kita mulai, tentunya kita familiar dengan tipe-tipe data string, integer, boolean, decimal, atau mungkin yang berupa collection seperi array, arraylist, hashtable, generic<T>. Tapi, seberapa familiar kita dengan tipe data generic bertipe Dictionary<Key,Value> atau NameValueCollection ? Kebanyakan mereka yang belajar workflow masih bingung dengannya. Kenapa saya bahas ini, karena ini juga merupakan basic fundamental dari passing data dari host ke workflow dan bagaimana retrieve data dari workflow ke host.

Di level Host, kita membuat sebuah turunan dan workflow engine dan kemudian create workflow instance berdasarkan workflow yang kita load. Misalkan ada kode berikut ini pada level Host (anggaplah kita menggunakan pendekatan console UI).

static void Main(string[] args)
{
    using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
        {
            waitHandle.Set();
        };

        workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
            waitHandle.Set();
        };

        WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1));
        instance.Start();

        waitHandle.WaitOne();

    }
}

Untuk melakukan passing data secara sederhanya, inilah yang harus dilakukan.

  1. Buat variabel bertipe dictionary di level host, lalu passing ke dalam factory method CreateWorkflow sebagai parameter setelah workflow.
  2. Pada workflow yang kita buat (misalkan namanya Workflow1.cs), tambahkan satu atau lebih public properties dengan tipe data yang kita sesuaikan. Properties ini nantinya akan bisa diambil kembali setelah workflow itu selesai dikerjakan melalui event WorkflowCompleted melalui WorkflowCompletedEventArgs.
  3. Host kemudian mengambil nilai properties ini melalui WorkflowCompletedEventArgs menggunakan collection OutputParameters.

Jadi, kode tersebut akan kita ubah sedikit sebagai berikut :

static void Main(string[] args)
{
    using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
        {
            waitHandle.Set();
        };

        workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
            waitHandle.Set();
        };

        Dictionary<string, object> wfParams = new Dictionary<string, object>();
        wfParams.Add("PublicProperty01InsideWorkflow1", "Suatu nilai"); 
        wfParams.Add("PublicProperty02InsideWorkflow1", "Suatu nilai"); 

        WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1), wfParams);
        instance.Start();

        waitHandle.WaitOne();

    }
}

Perhatikan yang dicetak tebal. Itu adalah tipe data generic Dictionary<> yang akan dipassing pada workflow. Key pada wfParams itu harus sesuai dengan public property yang dideklarasikan pada workflow. Jadi, kode pada workflow Workflow1.cs sekarang akan kita tambahkan dua buah public property sebagai berikut :

using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Drawing;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;

namespace MyWorkflowProject
{
   public sealed partial class Workflow1: SequentialWorkflowActivity
   {
        private string publicProperty01InsideWorkflow1;
        public string PublicProperty01InsideWorkflow1 {
            get { return publicProperty01InsideWorkflow1; }
            set { publicProperty01InsideWorkflow1 = value; }
        }
 
        private string publicProperty02InsideWorkflow1;
        public string PublicProperty02InsideWorkflow1 {
            get { return publicProperty02InsideWorkflow1; }
            set { publicProperty02InsideWorkflow1 = value; }
        }
 
        private string documents;
        public Documents ListDocument {
            get { return documents; }
            set { documents = value; }
        }

        public Workflow1()
        {
             InitializeComponent();
        }

    }
}

Di dalam Workflow1.cs  saya menambahkan 3 public properties. Yang dua bertipe string, dan satu lagi bertipe custom object bernama Documents.

Nah, di dalam workflow itu kita bisa memasukkan CodeActivity atau activity yang lainnya untuk memanipulasi private variabel, nilainya kemudian akan dilewatkan oleh workflow melalui WorkflowCompletedEventArgs di dalam event WorkflowCompleted. Jadi, host sekarang bisa retrieve nilainya sebagai berikut :

static void Main(string[] args)
{
    using(WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        AutoResetEvent waitHandle = new AutoResetEvent(false);
        workflowRuntime.WorkflowCompleted += delegate(object sender, WorkflowCompletedEventArgs e) 
        {
            Documents docs = (Documents)e.OutputParameters["ListDocument"];
            string prop1 = (string)e.OutputParameters["PublicProperty01InsideWorkflow1"];
            string prop2 = (string)e.OutputParameters["PublicProperty02InsideWorkflow1"];
            Console.WriteLine(string.Format("Nilai property 1 dan 2 = {0} dan {1}", prop1, prop2));

            waitHandle.Set();
        };

        workflowRuntime.WorkflowTerminated += delegate(object sender, WorkflowTerminatedEventArgs e)
        {
            Console.WriteLine(e.Exception.Message);
            waitHandle.Set();
        };

        Dictionary<string, object> wfParams = new Dictionary<string, object>();
        wfParams.Add("PublicProperty01InsideWorkflow1", "Suatu nilai"); 
        wfParams.Add("PublicProperty02InsideWorkflow1", "Suatu nilai"); 

        WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(Workflow1), wfParams);
        instance.Start();

        waitHandle.WaitOne();

    }
}

See, itu model passing data atau komunikasi sederhana antara host dengan workflow dan workflow dengan host melalui workflow parameters. Kita bisa menambahkan properties atau method pada workflow kita lalu menyimpan nilainya. Kemudian nilai ini akan bisa diretrieve oleh host ketika workflow itu selesai. Perhatikan bahwa saya melakukan casting karena pada dictionary yang saya lewatkan menggunakan pasangan <Key,Value> bertipe <string,object>. Anda bisa saja menggunakan pasangan <Key,Value> lain seperti <string,string> atau <string, Document>, atau apapun yang Anda inginkan.

Jika Anda belum familiar dengan generic bertipe Dictionary<Key,Value> atau NameValueCollection atau semua yang berpasangan menggunakan <Key,Value>, maka saatnya mulai melakukan explorasi tipe data tersebut. Ini akan memudahkan Anda memahami konsep dasar workflow.

Share this post: | | | |
Published Wednesday, August 22, 2007 12:04 PM by agung
Filed under:

Comments

No Comments