Trong các bài viết trước, chúng ta đã được giới thiệu về Variables, Arguments trong WF4 và cũng như đã tìm hiểu cách để khai báo và làm việc với Variables và Arguments thông qua các ví dụ đơn giản. Nếu như Variables trong WF4 có thể được xem là các class members thì đối với Arguments có thể được xem như là các method properties.
Trong bài viết này, chúng ta sẽ tìm hiểu cách khai báo và làm việc với Arguments trong một workflow. Bên cạnh đó là một số kỹ thuật đưa arguments vào workflow bằng code C#, khởi động workflow và nhận về kết quả từ workflow.
Tạo workflow project mới
Trong bài viết này, thông qua ví dụ xây dựng một workflow dùng để tính tổng giá trị của một đơn hàng chúng ta sẽ tìm hiểu về cách khai báo, làm việc cũng như một số kỹ thuật khác với Arguments.
Tạo mới một project Workflow Console Application có tên là TotalAmountOfOrder.
Sau khi khởi tạo project mới thành công, chúng ta sẽ định nghĩa các class tương ứng cần thiết cho ứng dụng. Trong ứng dụng ví dụ, chúng ta sẽ định nghĩa các class bao gồm Order và OrderItem như sau

Xây dựng workflow
Định nghĩa Arguments cho workflow
Thêm vào project một workflow mới có tên là TotalAmountWF. Sau đó bấm vào button Argument trong workflow designer để bắt đầu định nghĩa Arguments cho workflow. Workflow của chúng ta sẽ cần 2 argument là OrderInfo (InArgument – dùng để đưa thông tin về Order vào workflow) và TotalAmount (OutArgument – dùng để trả giá trị tính được ra ngoài).

Bắt đầu xây dựng activities cho workflow bằng việc đưa vào một Sequence activity. Trong Sequence sẽ là một WriteLine activity xuất ra console “Order Received.”
Để ý thấy rằng khi định nghĩa argument TotalAmount thì ở trường Default value chúng ta sẽ nhận được một thông báo là “Default value not supported”. Do đó, bước đầu tiên trong quá trình tính toán là gán giá trị ban đầu cho argument TotalAmount là 0 bằng việc thêm vào một Assign activity.

Tiếp đến, sau khi đã khởi tạo giá trị ban đầu cho argument TotalAmount, chúng ta sẽ tiến hành tính giá trị của các Item có trong Order. Để thực hiện được việc này, WF4 đã cung cấp sẵn cho chúng ta một activity là ForEach, cho phép chúng ta duyệt lần lượt qua tất cả các phần tử trong một tập hợp. Chú ý rằng ForEach<T> là một generic type, do đó cần phải quy định TypeArgument cho activity này, trong trường hợp này, TypeArgument cho ForEach<T> activity là OrderItem.

Với danh sách các Item có trong Order, chúng ta sẽ thực hiện việc tính tổng của các Item này theo công thức TotalAmount = TotalAmount + item.Price*item.Quantity

Tiếp tục là tùy vào phương thức vận chuyển sẽ có giá thích hợp. Trong ví dụ, giả sử chúng ta có 3 phương thức là : mặc định – vận chuyển trong 1 tuần, vận chuyển trong 1 ngày, vận chuyển trong 2 ngày. Với yêu cầu này, chúng ta sẽ sử dụng Switch<T> activity như sau
Đến đây, ứng với mỗi trường hợp, chúng ta sẽ thực hiện activities tương ứng. Tuy nhiên, trong trường hợp này ngoài việc chúng ta có thể sử dụng Assign activity để cập nhật lại TotalAmount, chúng ta sẽ tìm hiểu một số activity khác được cung cấp trong namespace System.Activities.Expressions.
Một số activities trong namespace System.Activities.Expressions
WF4 còn cung cấp cho chúng ta một số các activities khác trong namespace System.Activities.Expressions. Các activities được cung cấp tiêu biểu như Add, Subtract, Multiply, Divide, Equals, AndAlso, OrElse, ….
Tuy nhiên, để có thể sử dụng các activities này, chúng ta phải đưa vào toolbox bằng tay để sử dụng trong designer hoặc cần khai báo using nếu chúng ta muốn sử dụng trong code.

Sau khi đã thực hiện việc đưa các activities này ra toolbox cho thuận tiện trong việc sử dụng thì chúng ta có thể thoải mái kéo thả các activities này vào trong workflow.
Đây là một ví dụ trong việc sử dụng Add activities.

Cứ tiếp tục với các case còn lại và thực hiện tiếp với việc đưa coupon vào bằng các activities chúng ta sẽ được một workflow hoàn chỉnh như sau
Đưa Arguments vào workflow và chạy workflow
Workflow trên sau khi đã được định nghĩa, để có thể thực thi được thì cần truyền vào OrderInfo thông qua Arguments.
Đoạn mã sau sẽ thực hiện việc khai báo các in-arguments cho workflow, thực thi workflow và sau đó là nhận về out-arguments từ workflow sau khi đã thực thi xong
Code Snippet
- var inArguments = new Dictionary<string, object>();
- inArguments.Add("OrderInfo", myOrder);
-
- var outArguments = WorkflowInvoker.Invoke(new TotalAmountWF(), inArguments);
-
- var totalAmount = (decimal)outArguments["TotalAmount"];
- Console.WriteLine("Workflow returns ${0} for total amount.", totalAmount);