Click here to load reader
Upload
phthut1990
View
48
Download
0
Embed Size (px)
Citation preview
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
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).
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()
{
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
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.
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
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).
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!");
}
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:
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:
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
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;
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).
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:
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";
//
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;
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();
}
}
}
}
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
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:
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>
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
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à:
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