Creating Your First WCF 4.0 Workflow Service

WCF , Posted at : Jul/11/2011  
2518 Views   11 Comments

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


[Comments]
Samuel_N  Jul/13/2011 11:08:49 :

Nice article.. :D
 

mas, mau tanya soal penggunaan flow cart pada wcf workflow.
saya masih bingung mengenai penggunaannya.
mohon pencerahannya. :D

regards
 

Rully  Jul/13/2011 01:07:45 :

Samuel > Apabila control flow nya lebih kompleks dibandingkan dengan contoh yang di atas maka kita bisa menggunakan Flow Chart object :)

Samuel_N  Jul/15/2011 03:53:07 :

Saya masih bermasalah pada bagian contex di Customer.Activity.vb
context yang saya dapat masih berupa null value sehingga data customerID dan NorthwindDbnya masih null.
kira2 ini bermasalah di bagian mana ya mas?
mohon pencerahannya..

regards.
:)

 

Rully  Jul/15/2011 04:37:13 :

Samuel > Maaf...ada langkah yang tidak tertulis :) ...coba perhatikan lagi langkah 11 dan 13.

Samuel_N  Jul/15/2011 04:52:56 :

Problem solved..
thanx.. :D

dari yang saya lihat, berarti setiap bagian dari flowchart berhubungan melalui local variabel yang kita deklarasikan pada langkah 5 ya?
sepertinya setiap bagiannya hanya mengubah2 isi dari local variabelnya saja..
CMIIW..
:)

 

regards

Rully  Jul/18/2011 01:15:34 :

Samuel > Betul..kurang lebih seperti itu, dan digunakan juga sebagai object untuk passing ke input parameter yang di definisikan di activities. Variabel tersebut juga dapat diatur scope nya.

Sastra  May/11/2012 10:57:22 :

mas, mau tanya nih tentang workflow. saya saya sedang menggunakan workflow. tapi saya masih bingung gimana cara membuat variabelnya dan menggunakan variabel tersebut. terutama saat menentukan type variabelnya.

mohon bantuannya,

thanks...

Rully  May/11/2012 11:14:31 :

Sastra > Mungkin pelajari terlebih dahulu dasar-dasar pembuatan workflownya, karena topik yang ditanyakan itu merupakan langkah awal untuk melanjutkan ke bahasan berikutnya :)

Sastra  May/11/2012 11:25:34 :

oiya maaf mas, pertanyaan saya kurang spesifik tadi. jadi sebelumnya kan saya sudah coba pelajari dasar2nya, dengan membuat project2 latihan seperti aplikasi perhitungan yang tidak mengakses database. nah, ini saya lagi ada project membuat workflow yang mengakses database.

seperti contoh project yang mas buat diatas, kan mas membuat variabel localCustumerObject dengan type Custumer.

nah, type Custumer itu asalnya darimana ya mas?

regards,

Rully  May/11/2012 12:44:41 :

 Sastra > tipe data customer itu didapat dari linq to sql classes yang ditambahkan ke dalam project dimana tabel yang digunakan di dalam linq to sql tersebut yaitu customer dari database sample northwind.

Sastra  May/11/2012 06:24:09 :

iya mas, saya baru ngerti. tadi saya bingung mungkin karna tadi sedikit berbeda dengan yang saya buat. soalnya saya ga pakai linq untuk akses kedatabasenya. saya pake metode ADO. tapi skarang sudah bisa kok mas, ngikutin refferensi yang mas buat diatas.

oke deh mas, thanks bgt ya.sering2 share ilmu ya mas. biar kita yg junior ini bisa bnyk refferensi.

Hehe

regards,


[Write your comment]
Name (required)
Email (required-will not published)
 
Comment

VDHL
Input code above below (Case Sensitive) :
About Me 
Rully Yulian MF
Rully Yulian Muhammad Firmansyah | Microsoft Certified Trainer | IT Trainer at Native Enterprise | IT Consultant | Software Developer | MCAD | MCPD | MOS | Bandung, West Java, Indonesia.
[Read More...]
Top Download 
Mapping Hak Akses User Pada MenuStrip Sampai Control Button : Downloaded 6083 times  
Bagaimana caranya menginstal database ketika deploying sebuah aplikasi? : Downloaded 4689 times  
Simple Voice Engine Application With Sound Player Class... : Downloaded 3554 times  
Change Group,Sort Order, Filtering By Date in Crystal Reports : Downloaded 3324 times  
WinForms DataGrid Paging With SqlDataAdapter : Downloaded 2706 times  
Links 
Certifications 
MOS 2007
MCT
MCPD
MCTS
MCAD.NET
ASP.NET Brainbench
Native Enterprise 
Follow Me 
Facebook   LinkedIn   Twitter
Syndication 
Hosted By 
Native Enterprise News 
© Copyright 2006-2016   Rully Yulian MF   All rights reserved.