Pada kesempatan posting kali ini saya akan membahas penggunaan Workflow Service project yang di bangun dengan menggunakan WCF 4.0 dan Visual Studio 2010. Workflow service merupakan WCF service yang diimplementasikan dengan workflow foundation. Dengan memanfaatkan workflow foundation seorang business analyst dan application developer dapat bekerja sama dalam memvisualisasikan business process aplikasi yang akan dibuat. Keuntungan lainnya dari workflow service yaitu dalam hal pengaturan flow service terhadap operation-operation yang akan di konsumsi berdasarkan skenario atau request tertentu dimana hal tersebut relatif sulit untuk dilakukan langsung terhadap WCF Servicenya.
Untuk membangun workflow service dibutuhkan dasar pengetahuan mengenai WCF dan Workflow Foundation. Oleh karena di posting ini saya tidak akan membahas tentang WCF dan Workflow nya itu sendiri. Tools dan environment yang saya gunakan yaitu Visual Studio 2010, SQL Server 2008 dan Windows 7 Ultimate. Tentunya database dapat menggunakan edisi SQL Server yang lain, begitu juga dengan Windows 7 nya. Database hanya digunakan untuk mengambil atau memanipulasi data saja dan disini saya menggunakan Northwind database sample.
Berikut langkah-langkahnya :
1. Buat sebuah project template WCF Workflow Service Application (di bagian Workflow atau WCF) dan beri nama WcfWorkflowService (bahasa yang saya gunakan disini yaitu VB). Project template tersebut secara default sudah mereferensi ke library yang dibutuhkan untuk membangun WCF yaitu System.ServiceModel. Selain itu juga ditambahkan file web.config yang sudah berisi elemen yang digunakan untuk konfigurasi service. Service tersebut di host IIS, tentunya kita dapat mendeploy di WAS dan AppFabric.

2. Workflow service designer akan membuatkan sequential service control flow dimana didalamnya terdapat dua object Messaging yaitu ReceiveRequest yang digunakan untuk menerima request dan SendResponse untuk mengirim response ke client. Object workflow untuk service dapat dilihat di toolbox bagian Messaging :

3. Hapus file Service1.xamlx dan tambahkan item baru berupa WCF Workflow Service dan beri nama CustomerService.xamlx.
4. Tambahkan item baru berupa Linq To Sql Classes di bagian Data dan berikan nama Northwind.dbml. Drag tabel Customer dari Server Explorer ke Linq designer. Linq ini akan digunakan sebagai data access untuk service operation. Tentunya data access akan lebih baik kita simpan di project library yang terpisah.
5. Klik SequentialService object di workflow designer dan tambahkan beberapa variabel yang sifatnya lokal untuk activity-activity yang terdapat didalam flow tersebut dengan klik tab Variables di kiri bawah designer :

Tipe data NorthwindDataContext dapat dicari dengan browse type ke current project.
6. Klik kanan ReceiveRequest object di workflow designer dan pilih menu Properties. Ubah beberapa value untuk beberapa properti berikut ini :
- CanCreateInstance : Pastikan nilainya true. Nilai tersebut akan membuat sebuah instance workflow apabila terdapat request dari client. Apabila nilainya false maka service yang di request client tidak akan dapat di proses.
- Content : Klik content, buat sebuah parameter yang digunakan untuk menerima input dari client dan di assignment ke variabel lokal seperti berikut ini :

- Operation Name : GetCustomer. Field ini digunakan untuk mendefinisikan nama operation contract di WSDL yang akan dipanggil oleh client. Tentunya kita dapat mengisi dengan nama yang sesuai dengan fungsi operasi tersebut.
- ServiceContractName : {http://localhost:1234/}ICustomerService . Anda bisa bandingkan field tersebut dengan Interface yang dibuat di WCF Service sebagai Service Contractnya. Definisikan port yang akan digunakan sebagai bagian dari base address. Nomor port dapat kita buat static agar port yang digunakan oleh visual studio tidak berubah-ubah. Lakukan hal tersebut dengan double klik My Project node di solution explorer dan ubah port number nya di bagian Web :

7. Klik Content properti di SendResponse object dan buat sebuah parameter seperti berikut ini :

Variabel ReturnedCustomer digunakan sebagai variabel yang akan mengembalikan object Customer sebagai hasil atau response dari client request.
8. Tambahkan item baru kedalam project berupa CodeActivity dan berikan nama Customer.Activities.vb. Anda dapat membandingkan code activity ini dengan service implementation di wcf service. Setiap service implementasi diwujudkan dalam sebuah class yang di inherits dari CodeActivity Generic Class dimana return valuenya tinggal kita tentukan sesuai dengan object yang akan dikembalikan. Tentunya dapat kita tambahkan juga input parameter atau output parameter yang nantinya dibutuhkan di dalam activity tersebut layaknya pembuatan variabel di activity yang design based. Fungsi Execute merupakan fungsi yang akan dijalankan pada saat activity tersebut di proses.
9. Hapus deklarasi class yang ada di dalam code behind. ketikkan kode berikut ini :
Imports System.Activities
Friend NotInheritable Class DataHelper
Public Shared Function GetCustomerObject(
CustID As String,
Database As NorthwindDataContext) _
As IQueryable(Of Customer)
Return From c In Database.Customers
Where c.CustomerID.Equals(CustID)
End Function
End Class
Public NotInheritable Class IsCustomerExist
Inherits CodeActivity(Of Boolean)
Public Property NorthwindDatabase As InArgument(Of NorthwindDataContext)
Public Property CustomerID As InArgument(Of String)
Protected Overrides Function Execute(
context As CodeActivityContext) _
As Boolean
Return (DataHelper.GetCustomerObject(
CustomerID.Get(context),
NorthwindDatabase.Get(context))).Count > 0
End Function
End Class
Public NotInheritable Class GetCustomerByID
Inherits CodeActivity(Of Customer)
Public Property NorthwindDatabase As InArgument(Of NorthwindDataContext)
Public Property CustomerID As InArgument(Of String)
Protected Overrides Function Execute(
context As CodeActivityContext) _
As Customer
Return (DataHelper.GetCustomerObject(
CustomerID.Get(context),
NorthwindDatabase.Get(context))).Single
End Function
End Class
Class DataHelper digunakan untuk mengembalikan object Customer dari Linq To Sql yang sudah dibuat sebelumnya. Class IsCustomer akan mengembalikan nilai boolean sebagai hasil pengecekan data customer berdasarkan CustomerID kolom. Sedangkan class GetCustomerByID akan mengembalikan object Customer apabila pencarian datanya sukses.
10. Build project. Anda akan melihat komponen berikut ini di toolbox sebagai hasil kompilasi CodeActivity :

11. Drag dan Drop IsCustomerExist dari toolbox ke dalam workflow designer dibawah ReceiveRequest. Klik kanan IsCustomerExist object dan atur nilai-nilai propertinya seperti berikut ini :

12. Drag dan Drop If object dari Control Flow toolbox. Ketikkan localExist di Condition textbox yang merupakan variabel lokal sebagai hasil dari pencarian data customer berdasarkan CustomerID kolom.
13. Drag dan Drop GetCustomerByID kedalam kotak Then, atur nilai-nilai propertinya seperti berikut ini :


14. Build dan jalankan untuk melakukan test project tersebut. Wct Test Client.exe akan menjalankan workflow service tersebut.
Langkah berikutnya yaitu membuat aplikasi client yang akan mengkonsumsi wrokflow service yang sudah dibuat.
15. Tambahkan project template baru kedalam solution yang sama berupa Windows Form Application.
16. Add Service Reference ke workflow service ( http://localhost:1234/CustomerService.xamlx ) dan ubah Service Reference Name nya menjadi CustomerReference.
17. Tambahkan satu button dan DataGridView ke form. Ketikkan kode berikut ini di event handler click Button :
Private Sub Button1_Click(sender As System.Object,
e As System.EventArgs) Handles Button1.Click
Dim strID = InputBox("", "Input Customer ID Value")
If Not String.IsNullOrEmpty(strID) Then
Using proxy As New CustomerReference.CustomerServiceClient
Dim objCust = proxy.GetCustomer(strID)
Dim listCust = New List(Of CustomerReference.Customer)
listCust.Add(objCust)
DataGridView1.DataSource = listCust
End Using
End If
End Sub
18. Hasilnya dapat anda lihat seperti berikut ini :

Berikutnya saya berikan contoh aplikasi client yang menggunakan Workflow Console Application.
19. Tambahkan project template baru kedalam solution yang sama berupa Workflow Console Application.
20. Add Service Reference ke workflow service ( http://localhost:1234/CustomerService.xamlx ) dan ubah Service Reference Name nya menjadi CustomerReference. Setelah di build maka anda akan melihat komponen berikut ini di toolbox :

Nama komponen tersebut diambil dari Operation Name yang sudah diberikan di ReceiveRequest.
21. Tambahkan Sequence object dari toolbox Control Flow kedalam workflow designer.
22. Ketikkan beberapa variable lokal berikut ini di Sequence :

23. Drag dan Drop GetCustomer komponen ke dalam Sequence.
24. Klik kanan komponen GetCustomer dan ubah value beberapa properti (CustomerID dan ReturnedCustomer) berikut ini dengan melakukan assignment terhadap variabel lokal yang telah dibuat diatas:

25. Tambahkan WriteLine komponen dari Primitives toolbox dan ketikkan expression berikut ini di properti Text :
"ID : " & localCustomerID & ",Name : " & localReturnedCustomer.CompanyName & ",Contact : " & localReturnedCustomer.ContactName
26. Buka file Module1.vb dan tambahkan satu baris kode (di line-12) berikut ini :
1: Imports System.Activities
2: Imports System.Activities.Statements
3: Imports System.Diagnostics
4: Imports System.Linq
5:
6: Module Module1
7:
8: Dim s As Sequence
9:
10: Sub Main()
11: WorkflowInvoker.Invoke(New Workflow1())
12: Console.ReadLine()
13: End Sub
14:
15: End Module
27. Build dan jalankan. Hasilnya akan tampak seperti pada gambar dibawah ini :

Selamat mencoba 