23

Click here to load reader

WF Lesson 2

Embed Size (px)

Citation preview

Page 1: WF Lesson 2

MỤC LỤC

1. Mô hình lập trình WF ................................................................................................................... 2

1.1. Các Activitiy .....................................................................................................................................2

1.2. Tổ chức chạy WF ..............................................................................................................................4

1.3. Công việc của nhà phát triển WF ......................................................................................................6

1.3.1 Thiết kế workflow với sự trợ giúp của Workflow Designer .................................................6

1.3.2 Phân loại các lập trình viên liên quan đến WF .....................................................................7

2. Các cách viết WF ......................................................................................................................... 7

2.1. Xây dựng các workflow chỉ sử dụng mã lập trình ............................................................................9

2.2. Xây dựng các worklow sử dụng mã XAML ...................................................................................18

2.3. Kết luận ...........................................................................................................................................22

3. Câu hỏi ôn tập .............................................................................................................................22

4. Tài liệu tham khảo ......................................................................................................................23

Page 2: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 2

Bài hai

XÂY DỰNG WORKFLOW

Bài này trình bày tổn quan các khái niệm liên quan đến xây dựng workflow bao gồm: mô hình,

file nguồn, cách biên dịch và cấu trúc workflow. Sau đó, sẽ có hai ví dụ xây dựng hai workflow tương tự

nhau nhưng theo các phương pháp khác nhau bằng Visual Studio để bạn đọc có thể nắm rõ quy trình làm

việc với WF.

1. Mô hình lập trình WF

Workflow trong WF rất mềm dẻo và cơ động. Cùng với công cụ Visual Studio, các lập trình viên

có thể tạo, sửa đổi workflow một cách dễ dàng và năng suất. Đó là nhờ workflow được cấu thành từ các

thành phần cơ bản gọi là các activity (hành động), lập trình viên chỉ cần chọn các activity phù hợp, kéo

thả, cấu hình, kết nối chúng trên môi trường Designer trực quan của Visual Studio. Có thể nghĩ đến việc

xây dựng một workflow cũng giống như việc chọn các thiết bị để lắp ráp nên một chiếc tính hoàn thiện.

Hơn nữa workflow tồn tại ở phạm vi rất rộng vì tuy nó không sống độc lập như một ứng dụng được

nhưng nó có thể cư trú (host) lên bất cứ loại ứng dụng nào trên nền Microsoft .NET

1.1. Các Activitiy

Trước hết chúng ta cùng tìm hiểu về activity, đó là đơn vị thực thi cơ bản của chương trình WF.

Một activity trong một chương trình WF biểu diễn một khối của chương trình, một chức năng rời rạc. Ví

dụ có những activity thực hiện gọi thực thi một phương thức nào đó (CodeActivity), có các activity dùng

cho cấu trúc điều khiển (IfElse, While …). Đối với những lập trình viên đã quen thuộc với lập trình

Winform thì có thể tưởng tượng vai trò của activity trong WF cũng giống như vai trò của các control

trong Winform.

Trong WF, tất cả các Activity đều thừa kế từ lớp System.Workflow.ComponentModel.Activity.

Phương thức Excecute của nó được override để định nghĩa logic thực thi, phương thức này được cài đặt

thế nào thì sẽ quy định tính năng của activity đó.

Các activity phân làm hai loại: activity được cung cấp sẵn (out-of-the-box) nằm trong thư viện

chuẩn BAL (Base Activity Library) và activity tùy biến của người dùng (custom). Do người dùng có thể

tự định nghĩa các activity của mình nên workflow rất mềm dẻo, hầu như có thể làm bất cứ chuyện gì

tương tự như phong cách lập trình truyền thống (viết mã lệnh).

Page 3: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 3

Khi người dùng định nghĩa một activity, WF cho phép hai lựa chọn:

Activity cơ bản: chỉ thừa kế từ lớp Activity và override phương thức Execute.

Đoạn mã ví dụ sau đây định nghĩa một activity cơ bản

using System;

using System.Workflow.ComponentModel;

public class Empty : Activity

{

protected override ActivityExecutionStatus Execute(

ActivityExecutionContext context)

{

return ActivityExecutionStatus.Closed;

}

}

Activity phức hợp: chứa các activity khác. Visual Studio trợ giúp cho chúng ta

định nghĩa activity dễ dàng. Có thể thiết kế Activity rất trực quan (hình 1).

Hình 1. Activity phức hợp

Và đây là mã của activity hình 1:

public partial class CompositeActivity

{

#region Designer generated code

[System.Diagnostics.DebuggerNonUserCode]

private void InitializeComponent()

{

Page 4: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 4

this.CanModifyActivities = true;

this.codeActivity1 = new

System.Workflow.Activities.CodeActivity();

//

// codeActivity1

//

this.codeActivity1.Name = "codeActivity1";

//

// CompositeActivity

//

this.Activities.Add(this.codeActivity1);

this.Name = "CompositeActivity";

this.CanModifyActivities = false;

}

#endregion

private CodeActivity codeActivity1;

}

1.2. Tổ chức chạy WF

Như đã giới thiệu trong bài 1, kiến trúc của WF quy định mọi WF đều phải chạy trên môi trường

WF runtime (hình 2), đó là thư viện tạo môi trường thực thi cho WF. Thực chất các WF không thể tự nó

chạy độc lập giống như các ứng dụng *.exe cổ điển được mà nó phải được tổ chức chạy trên một phạm vi

ứng dụng nền CLR nào đó như là winform, web form. WF runtime thực thi các workflow và quản lý

trạng thái của WF trong suốt thời gian sống của WF .

Hình 2. Kiến trúc của WF

Page 5: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 5

Để hiểu sâu hơn tại sao WF runtime chỉ có thể chạy trên một ứng dụng nào đó – gọi là ứng dụng

chủ (host application), chúng ta hãy nhớ đến đặc tính cơ bản của workflow: nó có thể chạy trong thời

gian dài. Bởi vì một workflow có thể chạy trong nhiều giờ, nhiều ngày thậm chí nhiều tuần, WF runtime

sẽ tự động tắt một workflow đang làm việc và lứu trạng thái của nó nếu nó không active trong một

khoảng thời gian dài. Để lưu trạng thái đó vào đĩa cứng, WF runtime lại phụ thuộc vào một dịch vụ lưu

trữ lâu dài nào đó được cung cấp cùng với tiến trình chủ, ví dụ ứng dụng chủ kiểu ASP.NET mà tổ chức

chạy WF dùng SQL Server để lưu. Các ứng dụng chủ khác có thể lưu các workflow ùng các công nghệ

khác như là một cơ sở dữ liệu nào đó được dùng cùng với ứng dụng của nhà cung cấp phần mềm. Lý do

nữa để Microsoft thiết kế cho phép workflow chạy trên ứng dụng khác là vì nhờ có thể workflow có thể

chạy ở tất cả các loại ứng dụng .NET, workflow chỉ quan tâm xử lý nghiệp vụ bên trong, không quan tâm

đến giao diện với người dùng và các ứng dụng khác.

Về cơ bản, để lưu trú (host) chương trình của của WF lên ứng dụng .NET nào đó rất đơn giản, ví

dụ như đoạn mã sau đây lưu trú workflow ExampleWorkflow lên ứng dụng Example host:

using System.Workflow.Runtime;

class ExampleHost

{

static void Main()

{

...

WorkflowRuntime runtime = new WorkflowRuntime();

WorkflowInstance instance =

runtime.CreateWorkflow(typeof(ExampleWorkflow));

instance.Start();

...

}

}

Trong ví dụ này, môi trường runtime chỉ là một lớp (ExampleHost). Một khi thể hiện của lớp này

được tạo, nó khởi tạo và gọi phương thức StartRuntime của workflow, và nhờ đó thực thi workflow. Tiến

trình chủ là thành phần cơ bản của môi trường tổ chức chạy workflow. Vì môi trường runtime có thể

được đặt trong các tiến trình Windows khác nhau, các workflow WF có thể được dùng ở rất nhiều các

ngữ cảnh.

Page 6: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 6

1.3. Công việc của nhà phát triển WF

1.3.1 Thiết kế workflow với sự trợ giúp của Workflow Designer

Cách đơn giản nhất để tạo và sửa các workflow WF là bằng trình thiết kế Workflow (Workflow

Designer). Mặc định trình thiết kế này nằm trong Visual Studio – chứa các mẫu project để tạo các

workflow dạng tuần tự hoặc máy trạng thái… Bằng cách kéo thả các activity vào vùng thiết kế và thiết

lập cá thuộc tính của chúng, các nhà phát triển có thể tạo và sửa workflow một cách dễ dàng. Cách tiếp

cận này tương tự như khi chúng ta làm các ứng dụng Windows Forms hay Windows Presentation

Foundation, các nhà phát triển thả các điều khiển vào form và tạo ra các giao diện người dùng. Với trình

thiết kế Workflow, các activity được thả vào workflow để tạo ra logic nghiệp vụ. Trong cả hai trường

hợp trên, mục đích hướng tới là như nhau: nâng cao năng suất phát triển phần mềm.

Dùng WF để làm phần mềm, các nhà phát triển phần mềm sẽ thay đổi hẳn phương pháp làm

phần mềm đối với các ứng dụng nặng về luồng công việc. Giờ đây không chỉ các giao diện người dùng

không cần phải viết mã nữa mà các logic nghiệp vụ (luồng công việc) cũng có thể được tạo ra theo cách

như vậy – thiết kế bằng công cụ trực quan. Đó là nhờ việc trực quan hóa sự hoạt động của các luồng công

việc, từng thành phần và sự kết nối giữa các thành phần được thể hiện trực quan bằng công cụ lập trình

tích hợp (như Visual Studio). (hinh 3).

`

Hình 3. Thiết kế workflow bằng Workflow Designer trong Visual Studio

Page 7: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 7

Giờ đây công việc của họ khi phát làm phần mềm là: thiết kế luồng công việc bằng công cụ trực

quan (trước đây họ phải viết mã lệnh cho các việc như thế này – công việc rất nhàm chán và rất khó để

kiểm thử xem có tuân theo đặc tả hay không, do các đặc tả đều thể hiện dưới dạng ký pháp trực quan), và

chỉ phải viết mã lệnh cho các đoạn xử lý hành động cụ thể.

1.3.2 Phân loại các lập trình viên liên quan đến WF

Hình 4. Những lập trình viên liên quan đến WF

Trong môi trường lập trình chuyên nghiệp, có những nhóm lập trình viên được

phân công chỉ tập trung làm những lĩnh vực nhỏ, rồi mới ghép các sản phẩm từ các nhóm đó với

nhau thành hệ thống lớn. Với WF, chúng ta có thể phân ra ba loại nhóm lập trình viên (hình 4):

Lập trình viên chuyên phát triển các ứng dụng chủ, đây là các ứng dụng truyền

thống trên nền .NET, vì thế lập trình viên không cần có hiểu biết sâu sắc và không cần thao tác

trực tiếp với WF.

Lập trình viên chuyên tạo ra các Activity: nhiệm vụ tạo ra các “viên gạch” cho

workflow.

Workflow Developer: Gắn kết các activity với nhau, cấu hình chúng để tạo nên

workflow hoàn thiện. Nhóm lập trình viên này không phải dùng nhiều đến mã lập trình mà chủ

yếu tương tác với trình Workflow Designer.

2. Các cách viết WF

Để tạo ra các workflow trong WF chúng ta có thể sử dụng mã lệnh của ngôn ngữ C#, VB.NET

hoặc dùng ngôn ngữ khai báo XAML (Đọc là zammel [„zæml]). Thông thường chúng ta có hay kết hợp

cả hai cách trên (hình 5).

Page 8: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 8

XAML là thuật ngữ viết tắt của Extensible Application Markup Language là một ngôn ngữ khai

báo được dùng trong Windows Framework đuợc giới thiệu cùng với .NET Framework 3.0. XAML là sự

mở đầu của mô hình lập trình khai báo (đối lập với mô hình cũ dùng mã lệnh). Trong WF, các workflows

có thể được tạo ra bằng mã lập trình hoặc bằng XAML đều tương đương với nhau. Thậm chí chúng ta có

thể khai báo workflow bằng XAML, không cần biên dịch mà chỉ cần load vào workflow runtime và chạy

trực tiếp.

Hình 5. Quy trình xây dựng workflow trong WF

Để thấy được sự khác nhau của hai phương pháp này và có thể đưa ra những cảm nhận so sánh

về hai phương pháp, trong bài này chúng tôi đưa ra hai ví dụ xây dựng workflow bằng hai phương pháp

đó với cùng một bài toán hết sức đơn giản: đếm từ 0 đến 10 và hiển thị số đó là chẵn hay lẻ. Logic của

bài toán trên thể hiện bằng mã chương trình bình thường như sau:

int counter =0;

while (counter != 10)

{

if (counter % 2 == 0)

Console.WriteLine(Convert.ToString(counter) + " is an even

number!");

else

Console.WriteLine(Convert.ToString(counter) + " is an odd

number!");

}

Page 9: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 9

2.1. Xây dựng các workflow chỉ sử dụng mã lập trình

Khởi động Visual Studio, tạo một dự án mới chọn ngôn ngữ Visual C# với

workflow và chọn template là Sequential Workflow Console Application. Đặt tên dự án là

FirstCodeWFApplication.

Hình 6. Tạo project FirstCodeWFApplication

Mặc định Visual Studio tạo cho chúng ta một workflow tên là workflow1 và

ngôn ngữ của nó là lệnh C# (Workflow1.cs – xem trong Solution Explorer). Visual Studio cũng

tạo sẵn file program.cs là WF runtime của workflow1. Nếu ai đã từng làm việc với các ứng dụng

vWinform hay vWebform trong Visual Studio hẳn sẽ rất quen thuộc với phong cách code behide

hay partial file của workflow, lớp Workflow1 được định nghĩa bằng 2 file Workflow1.cs và

Workflow1.designer.cs. Mở Toolbox (Ctrl+W, X), kéo activity while vào vùng thiết kế của

workflow, đặt giữa điểm khởi đầu (mầu xanh) và điểm kết thúc (mầu đỏ), chúng ta thấy

workflow có hình như sau:

Page 10: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 10

Hình 7. Thiết kế workflow

Bạn có thể thấy hình dấu chấm than đỏ, đó là Visual Studio báo cho chúng ta

rằng activity vwhile của chúng ta chưa hợp lệ vì chưa được thiết lập điều kiện lặp. Bây giờ hãy

thêm một thuộc tính private cho lớp workflow trước đã:

namespace FirstCodeWFApplication

{

public sealed partial class Workflow1: SequentialWorkflowActivity

{

public Int32 counter;

public Workflow1()

{

InitializeComponent();

}

}

}

Hãy trở lại cửa sổ thiết kế và click chuột vào whileActivity1, bấm F4 để hiển thị

các thuộc tính của nó, hãy chọn Condition giá trị là “Declarative Rule Condition” từ combobox,

mở dấu + ở Condition, rồi dòng ConditionName hãy ấn vào nút … để hiển thị hộp chọn luật như

hình 8:

Page 11: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 11

Hình 8. Hộp thoại chọn luật cho activity While

Click vào nút „New‟ để vào hộp thoại 'Rule Condition Editor' và soạn điều kiện

kết thúc cho vòng while giống như hình 9.

.

Hình 9. Soạn luật

Page 12: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 12

Chọn OK hai lần, chúng ta đã thiết lập xong vòng while. Hãy xem trình thiết kế

đã làm gì cho chúng ta? Một đoạn mã khai báo workflow đã được sinh ra trong file

Workflow1.designer.cs như sau (chú ý không nên sửa file này):

namespace FirstCodeWFApplication

{

partial class Workflow1

{

#region Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

[System.Diagnostics.DebuggerNonUserCode]

private void InitializeComponent()

{

this.CanModifyActivities = true;

System.Workflow.Activities.Rules.RuleConditionReference

ruleconditionreference1 = new

System.Workflow.Activities.Rules.RuleConditionReference();

this.whileActivity1 = new

System.Workflow.Activities.WhileActivity();

//

// whileActivity1

//

ruleconditionreference1.ConditionName = "Condition1";

this.whileActivity1.Condition = ruleconditionreference1;

this.whileActivity1.Name = "whileActivity1";

//

// Workflow1

//

this.Activities.Add(this.whileActivity1);

this.Name = "Workflow1";

this.CanModifyActivities = false;

}

#endregion

private WhileActivity whileActivity1;

Page 13: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 13

}

}

Tiếp tục trở lại với màn hình thiết kế workflow, hãy thêm một activity dạng

IfElse vào trong whileActivity1, sau đó thêm hai Code activity vào hai nhánh của IfElse. Giờ đây

workflow của chúng ta thể hiện như sau hình 10:

Hình 10. Workflow hoàn thiện với các activity của nó

Tương tự như activity while, activity IfElse cũng cần thiết lập các điều kiện.

Chúng ta lại thêm luật và gán cho nhánh bên trái của IfElse (từ cửa sổ Properties chọn

Condition Rule Condition Editor) (hình 11).

Page 14: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 14

Hình 11. Luật cho nhánh bên phải của activity IfElse

Việc tiếp theo của chúng ta là viết mã cho các codeActivity1 và codeActivity2.

Hãy click đúp chuột vào các code Activity đó và thêm các đoạn mã như sau:

private void codeActivity1_ExecuteCode(object sender, EventArgs e)

{

System.Console.WriteLine(counter.ToString() + " is an event

number");

counter++;

}

private void codeActivity2_ExecuteCode(object sender, EventArgs e)

{

System.Console.WriteLine(counter.ToString() + " is an odd number");

counter++;

}

Bây giờ hãy xem lại mã định nghĩa Workflow1 trong file

Workflow1.designer.cs:

Page 15: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 15

namespace FirstCodeWFApplication

{

partial class Workflow1

{

#region Designer generated code

/// <summary>

/// Required method for Designer support - do not modify

/// the contents of this method with the code editor.

/// </summary>

[System.Diagnostics.DebuggerNonUserCode]

private void InitializeComponent()

{

this.CanModifyActivities = true;

System.Workflow.Activities.Rules.RuleConditionReference

ruleconditionreference1 = new

System.Workflow.Activities.Rules.RuleConditionReference();

System.Workflow.Activities.Rules.RuleConditionReference

ruleconditionreference2 = new

System.Workflow.Activities.Rules.RuleConditionReference();

this.codeActivity2 = new

System.Workflow.Activities.CodeActivity();

this.codeActivity1 = new

System.Workflow.Activities.CodeActivity();

this.ifElseBranchActivity2 = new

System.Workflow.Activities.IfElseBranchActivity();

this.ifElseBranchActivity1 = new

System.Workflow.Activities.IfElseBranchActivity();

this.ifElseActivity1 = new

System.Workflow.Activities.IfElseActivity();

this.whileActivity1 = new

System.Workflow.Activities.WhileActivity();

//

// codeActivity2

//

this.codeActivity2.Name = "codeActivity2";

//

// codeActivity1

//

this.codeActivity1.Name = "codeActivity1";

//

Page 16: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 16

// ifElseBranchActivity2

//

this.ifElseBranchActivity2.Activities.Add(this.codeActivity2);

this.ifElseBranchActivity2.Name = "ifElseBranchActivity2";

//

// ifElseBranchActivity1

//

this.ifElseBranchActivity1.Activities.Add(this.codeActivity1);

ruleconditionreference1.ConditionName = "Condition2";

this.ifElseBranchActivity1.Condition =

ruleconditionreference1;

this.ifElseBranchActivity1.Name = "ifElseBranchActivity1";

//

// ifElseActivity1

//

this.ifElseActivity1.Activities.Add(this.ifElseBranchActivity1);

this.ifElseActivity1.Activities.Add(this.ifElseBranchActivity2);

this.ifElseActivity1.Name = "ifElseActivity1";

//

// whileActivity1

//

this.whileActivity1.Activities.Add(this.ifElseActivity1);

ruleconditionreference2.ConditionName = "Condition1";

this.whileActivity1.Condition = ruleconditionreference2;

this.whileActivity1.Name = "whileActivity1";

//

// Workflow1

//

this.Activities.Add(this.whileActivity1);

this.Name = "Workflow1";

this.CanModifyActivities = false;

}

#endregion

private CodeActivity codeActivity2;

private CodeActivity codeActivity1;

Page 17: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 17

private IfElseBranchActivity ifElseBranchActivity2;

private IfElseBranchActivity ifElseBranchActivity1;

private IfElseActivity ifElseActivity1;

private WhileActivity whileActivity1;

}

}

Và cuối cùng, sửa một chút file Program.cs để chúng ta có thể xem được kết quả

hoạt động của workflow. Thêm dòng System.Console.Read(); vào cuối hàm Main.

namespace FirstCodeWFApplication

{

class Program

{

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(FirstCodeWFApplication.Workflow1));

instance.Start();

waitHandle.WaitOne();

System.Console.Read();

}

}

}

}

Page 18: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 18

Giờ đã xong, hãy ấn F5 để xem thành quả, chương trình sẽ thể hiện như sau:

Hình 12. Kết quả chạy workflow

2.2. Xây dựng các worklow sử dụng mã XAML

Trong Visual Studio, hãy tạo một dự án mới, ở phần thiết lập, tương tự như ứng

dụng bằng mã ở phần 2.1, chọn template là Sequential Workflow Console Application, đặt tên dự

án là FirstXAMLWFApplication.

Hình 13. Tạo project FirstXAMLWFApplication

Page 19: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 19

Mặc định, dự án Workflow bao gồm file mã nguồn định nghĩa workflow, vì

chúng ta muốn làm việv với XAML, hãy xóa file workflow1 đi. Sau đó thay thế bằng file định

nhĩa workflow bằng XAML: chuột phải vào Solution Explorer, chọn 'Add New Item' sau đó

chọn 'Sequential Workflow with Code Separation' file. 'Code Separation'.

Hình 14. Tạo workflow với mã XAML

Hãy sửa tên file vừa tạo ra thành MyWorkflow.xoml. Cần phải chú ý là file *.oml chính là file

định nghĩa workflow bằng XAML.

Thiết kế workflow tương tự như ở phần 1.2 trên:

Page 20: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 20

Hình 15. Thiết kế workflow MyWorkflow

Hãy mở file MyWorkflow.xoml, chúng ta thấy bản chất nó là 1 file XAML, mọi

thành phần của workflow đều có thể được viết bằng ngôn ngữ xml, khá đơn giản kể cả cho

những người không chuyên về kỹ thuật lập trình.

<SequentialWorkflowActivity x:Class="FirstXAMLWFApplication.MyWorkflow"

x:Name="MyWorkflow" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/workflow">

<WhileActivity x:Name="whileActivity1">

<WhileActivity.Condition>

<RuleConditionReference ConditionName="Condition1" />

</WhileActivity.Condition>

<IfElseActivity x:Name="ifElseActivity1">

<IfElseBranchActivity x:Name="ifElseBranchActivity1">

<IfElseBranchActivity.Condition>

<RuleConditionReference ConditionName="Condition2" />

</IfElseBranchActivity.Condition>

<CodeActivity x:Name="codeActivity1"

ExecuteCode="codeActivity1_ExecuteCode" />

</IfElseBranchActivity>

Page 21: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 21

<IfElseBranchActivity x:Name="ifElseBranchActivity2">

<CodeActivity x:Name="codeActivity2"

ExecuteCode="codeActivity2_ExecuteCode" />

</IfElseBranchActivity>

</IfElseActivity>

</WhileActivity>

</SequentialWorkflowActivity>

Sau đó, tương tự như ở phần 2.1, hãy thiết lập các luật và cho các activiy While

và IfElse, xong. Thiết lập mã cho các activity Code1 và Code2.

Sửa lại file chủ Program.cs như sau để gọi workflow chạy:

class Program

{

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(FirstXAMLWFApplication.Workflow1));

instance.Start();

waitHandle.WaitOne();

System.Console.Read();

}

}

}

Kết quả chạy hoàn toàn tương tự ở phần 2.1

Page 22: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 22

2.3. Kết luận

Như vậy chúng ta thấy là việc tạo các workflow bằng mã lập trình và XAML đều tương đương

nhau. XAML có ưu điểm về bản chất nó là ngôn ngữ xml, đơn giản dễ viết bằng bất cứ trình soạn thảo

text đơn giản nào và không cần biên dịch để chạy. Người không quen với việc lập trình cũng có thể tạo ra

các workflow của mình với các file XAML. Đối với những người xưa nay quen làm việc với các ngôn

ngữ lập trình như C#, Visual Basic thì vẫn có thể làm các workflow bằng ngôn ngữ quen thuộc của họ mà

không cần quan tâm đến dạng lập trình khai báo như XAML. Tóm lại là tùy thuộc vào đói tượng người

dùng họ chọn phương pháp nào để thiết kế workflow của họ đều mang lại hiệu quả như nhau. Tuy nhiên

xu hướng lập trình khai báo với XAML có lẽ sẽ trở thành một phong trào trong thời gian sắp tới.

3. Câu hỏi ôn tập

1. Trong các workflow, Activity là gì

Các Activity (hành động ) là đơn vị cơ bản của chương trình WF. Một activity trong một chương

trình WF biểu diễn một khối của chương trình, một chức năng rời rạc (vòng lặp, rẽ nhánh, đoạn mã…)

2. XOML là gì?

XOML (Extensible Object Markup Language) là ngôn ngữ đặc tả dạng XML dùng để định dạng

tuần tự hóa cho các đối tượng WF. Thực tế, XOML là một dạng của XAML, chỉ khác là XOML được

dùng làm phần mở rộng của các file định nghĩa các workflow.

Khi tạo một workflow với VS.NET, nó cho phép tùy chọn định nghĩa workflow bằng lệnh lập

trình hoặc XAML, nếu chọn dạng XAML, trình IDE sẽ tạo 2 file cho bạn, 1 ở dạng xoml (chứa cách bố

trí workflow và các cài đặt) và một ở dạng file mã lập trình .cs/.vb (chứa mã định nghĩa cho các hành

động cụ thể code activity trong workflow).

3. Có thể sử dụng cách nào để làm workflow trong WF:

A. Sử dụng XAML

B. Sử dụng mã lập trình (C#, Visual Basic…)

C. A và B

D. Không có cách nào trong các cách trên

Câu trả lời C

4. Phần mở rộng của file XAML định nghĩa workflow là:

Page 23: WF Lesson 2

Microsoft Vietnam – DPE Team | WF – Bài 2: Xây dựng Workflow 23

A. xaml

B. xoml

C. xml

D. cs

E. Tất cả

Câu trả lời B

4. Tài liệu tham khảo

1. K. Scott Allen, Programming Windows Workflow Foundation, Packt Publishing Ltd. December

2006 ISBN 1-904811-21-3

2. Dharma Shukla and Bob Schmidt, Essential Windows Workflow Foundation, Addison Wesley

Professional 2006

3. Microsoft, Windows Workflow Foundation, URL: http://msdn2.microsoft.com/en-

us/netframework/aa663328.aspx

4. Microsoft, Windows Workflow Foundation Overview, URL: http://msdn.microsoft.com/en-

us/library/ms734631.aspx

5. Microsoft, MSDN (Windows Workflow Foundation (WF)), URL:

http://msdn.microsoft.com/en-us/netframework/aa663328.aspx