Professional Documents
Culture Documents
WF Lesson 2
WF Lesson 2
WF Lesson 2
1.
M hnh lp trnh WF ................................................................................................................... 2 1.1. Cc Activitiy .....................................................................................................................................2 1.2. T chc chy WF ..............................................................................................................................4 1.3. Cng vic ca nh pht trin WF ......................................................................................................6 1.3.1 1.3.2 Thit k workflow vi s tr gip ca Workflow Designer .................................................6 Phn loi cc lp trnh vin lin quan n WF .....................................................................7
2.
Cc cch vit WF ......................................................................................................................... 7 2.1. Xy dng cc workflow ch s dng m lp trnh ............................................................................9 2.2. Xy dng cc worklow s dng m XAML ...................................................................................18 2.3. Kt lun ...........................................................................................................................................22
3. 4.
1. M hnh lp trnh WF
Workflow trong WF rt mm do v c ng. Cng vi cng c Visual Studio, cc lp trnh vin c th to, sa i workflow mt cch d dng v nng sut. l nh workflow c cu thnh t cc thnh phn c bn gi l cc activity (hnh ng), lp trnh vin ch cn chn cc activity ph hp, ko th, cu hnh, kt ni chng trn mi trng Designer trc quan ca Visual Studio. C th ngh n vic xy dng mt workflow cng ging nh vic chn cc thit b lp rp nn mt chic tnh hon thin. Hn na workflow tn ti phm vi rt rng v tuy n khng sng c lp nh mt ng dng c nhng n c th c tr (host) ln bt c loi ng dng no trn nn Microsoft .NET
1.1. Cc Activitiy
Trc ht chng ta cng tm hiu v activity, l n v thc thi c bn ca chng trnh WF. Mt activity trong mt chng trnh WF biu din mt khi ca chng trnh, mt chc nng ri rc. V d c nhng activity thc hin gi thc thi mt phng thc no (CodeActivity), c cc activity dng cho cu trc iu khin (IfElse, While ). i vi nhng lp trnh vin quen thuc vi lp trnh Winform th c th tng tng vai tr ca activity trong WF cng ging nh vai tr ca cc control trong Winform. Trong WF, tt c cc Activity u tha k t lp System.Workflow.ComponentModel.Activity. Phng thc Excecute ca n c override nh ngha logic thc thi, phng thc ny c ci t th no th s quy nh tnh nng ca activity . Cc activity phn lm hai loi: activity c cung cp sn (out-of-the-box) nm trong th vin chun BAL (Base Activity Library) v activity ty bin ca ngi dng (custom). Do ngi dng c th t nh ngha cc activity ca mnh nn workflow rt mm do, hu nh c th lm bt c chuyn g tng t nh phong cch lp trnh truyn thng (vit m lnh).
Microsoft Vietnam DPE Team | WF Bi 2: Xy dng Workflow 2
Khi ngi dng nh ngha mt activity, WF cho php hai la chn: Activity c bn: ch tha k t lp Activity v override phng thc Execute.
Activity phc hp: cha cc activity khc. Visual Studio tr gip cho chng ta
Activity phc hp
[System.Diagnostics.DebuggerNonUserCode] private void InitializeComponent() { Microsoft Vietnam DPE Team | WF Bi 2: Xy dng Workflow 3
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; }
Hnh 2.
Kin trc ca WF
4
hiu su hn ti sao WF runtime ch c th chy trn mt ng dng no gi l ng dng ch (host application), chng ta hy nh n c tnh c bn ca workflow: n c th chy trong thi gian di. Bi v mt workflow c th chy trong nhiu gi, nhiu ngy thm ch nhiu tun, WF runtime s t ng tt mt workflow ang lm vic v lu trng thi ca n nu n khng active trong mt khong thi gian di. lu trng thi vo a cng, WF runtime li ph thuc vo mt dch v lu tr lu di no c cung cp cng vi tin trnh ch, v d ng dng ch kiu ASP.NET m t chc chy WF dng SQL Server lu. Cc ng dng ch khc c th lu cc workflow ng cc cng ngh khc nh l mt c s d liu no c dng cng vi ng dng ca nh cung cp phn mm. L do na Microsoft thit k cho php workflow chy trn ng dng khc l v nh c th workflow c th chy tt c cc loi ng dng .NET, workflow ch quan tm x l nghip v bn trong, khng quan tm n giao din vi ngi dng v cc ng dng khc. V c bn, lu tr (host) chng trnh ca ca WF ln ng dng .NET no rt n gin, v d nh on m sau y lu tr workflow ExampleWorkflow ln ng dng 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 ny, mi trng runtime ch l mt lp (ExampleHost). Mt khi th hin ca lp ny c to, n khi to v gi phng thc StartRuntime ca workflow, v nh thc thi workflow. Tin trnh ch l thnh phn c bn ca mi trng t chc chy workflow. V mi trng runtime c th c t trong cc tin trnh Windows khc nhau, cc workflow WF c th c dng rt nhiu cc ng cnh.
Cch n gin nht to v sa cc workflow WF l bng trnh thit k Workflow (Workflow Designer). Mc nh trnh thit k ny nm trong Visual Studio cha cc mu project to cc workflow dng tun t hoc my trng thi Bng cch ko th cc activity vo vng thit k v thit lp c thuc tnh ca chng, cc nh pht trin c th to v sa workflow mt cch d dng. Cch tip cn ny tng t nh khi chng ta lm cc ng dng Windows Forms hay Windows Presentation Foundation, cc nh pht trin th cc iu khin vo form v to ra cc giao din ngi dng. Vi trnh thit k Workflow, cc activity c th vo workflow to ra logic nghip v. Trong c hai trng hp trn, mc ch hng ti l nh nhau: nng cao nng sut pht trin phn mm. Dng WF lm phn mm, cc nh pht trin phn mm s thay i hn phng php lm phn mm i vi cc ng dng nng v lung cng vic. Gi y khng ch cc giao din ngi dng khng cn phi vit m na m cc logic nghip v (lung cng vic) cng c th c to ra theo cch nh vy thit k bng cng c trc quan. l nh vic trc quan ha s hot ng ca cc lung cng vic, tng thnh phn v s kt ni gia cc thnh phn c th hin trc quan bng cng c lp trnh tch hp (nh Visual Studio). (hinh 3).
Gi y cng vic ca h khi pht lm phn mm l: thit k lung cng vic bng cng c trc quan (trc y h phi vit m lnh cho cc vic nh th ny cng vic rt nhm chn v rt kh kim th xem c tun theo c t hay khng, do cc c t u th hin di dng k php trc quan), v ch phi vit m lnh cho cc on x l hnh ng c th. 1.3.2 Phn loi cc lp trnh vin lin quan n WF
Hnh 4.
phn cng ch tp trung lm nhng lnh vc nh, ri mi ghp cc sn phm t cc nhm vi nhau thnh h thng ln. Vi WF, chng ta c th phn ra ba loi nhm lp trnh vin (hnh 4): Lp trnh vin chuyn pht trin cc ng dng ch, y l cc ng dng truyn thng trn nn .NET, v th lp trnh vin khng cn c hiu bit su sc v khng cn thao tc trc tip vi WF. workflow. Workflow Developer: Gn kt cc activity vi nhau, cu hnh chng to nn workflow hon thin. Nhm lp trnh vin ny khng phi dng nhiu n m lp trnh m ch yu tng tc vi trnh Workflow Designer. Lp trnh vin chuyn to ra cc Activity: nhim v to ra cc vin gch cho
2. Cc cch vit WF
to ra cc workflow trong WF chng ta c th s dng m lnh ca ngn ng C#, VB.NET hoc dng ngn ng khai bo XAML (c l zammel [zml]). Thng thng chng ta c hay kt hp c hai cch trn (hnh 5).
Microsoft Vietnam DPE Team | WF Bi 2: Xy dng Workflow 7
XAML l thut ng vit tt ca Extensible Application Markup Language l mt ngn ng khai bo c dng trong Windows Framework uc gii thiu cng vi .NET Framework 3.0. XAML l s m u ca m hnh lp trnh khai bo (i lp vi m hnh c dng m lnh). Trong WF, cc workflows c th c to ra bng m lp trnh hoc bng XAML u tng ng vi nhau. Thm ch chng ta c th khai bo workflow bng XAML, khng cn bin dch m ch cn load vo workflow runtime v chy trc tip.
Hnh 5.
thy c s khc nhau ca hai phng php ny v c th a ra nhng cm nhn so snh v hai phng php, trong bi ny chng ti a ra hai v d xy dng workflow bng hai phng php vi cng mt bi ton ht sc n gin: m t 0 n 10 v hin th s l chn hay l. Logic ca bi ton trn th hin bng m chng trnh bnh thng 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!"); }
Hnh 6.
To project FirstCodeWFApplication
ngn ng ca n l lnh C# (Workflow1.cs xem trong Solution Explorer). Visual Studio cng to sn file program.cs l WF runtime ca workflow1. Nu ai tng lm vic vi cc ng dng vWinform hay vWebform trong Visual Studio hn s rt quen thuc vi phong cch code behide hay partial file ca workflow, lp Workflow1 c nh ngha bng 2 file Workflow1.cs v Workflow1.designer.cs. M Toolbox (Ctrl+W, X), ko activity while vo vng thit k ca workflow, t gia im khi u (mu xanh) v im kt thc (mu ), chng ta thy workflow c hnh nh sau:
Hnh 7.
Thit k workflow
rng activity vwhile ca chng ta cha hp l v cha c thit lp iu kin lp. By gi hy thm mt thuc tnh private cho lp workflow trc :
namespace FirstCodeWFApplication { public sealed partial class Workflow1: SequentialWorkflowActivity { public Int32 counter; public Workflow1() { InitializeComponent(); } } }
cc thuc tnh ca n, hy chn Condition gi tr l Declarative Rule Condition t combobox, m du + Condition, ri dng ConditionName hy n vo nt hin th hp chn lut nh hnh 8:
10
Hnh 8.
Chn OK hai ln, chng ta thit lp xong vng while. Hy xem trnh thit k
lm g cho chng ta? Mt on m khai bo workflow c sinh ra trong file Workflow1.designer.cs nh sau (ch khng nn sa file ny):
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 Bi 2: Xy dng Workflow 12
} }
IfElse vo trong whileActivity1, sau thm hai Code activity vo hai nhnh ca IfElse. Gi y workflow ca chng ta th hin nh sau hnh 10:
Hnh 10.
Chng ta li thm lut v gn cho nhnh bn tri ca IfElse (t ca s Properties chn Condition Rule Condition Editor) (hnh 11).
13
Hnh 11.
By
gi
hy
xem
li
nh
ngha
Workflow1
trong
file
Workflow1.designer.cs:
14
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 Bi 2: Xy dng Workflow 15
// 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 Bi 2: Xy dng Workflow 16
private IfElseBranchActivity ifElseBranchActivity2; private IfElseBranchActivity ifElseBranchActivity1; private IfElseActivity ifElseActivity1; private WhileActivity whileActivity1; } }
17
Hnh 12.
Kt qu chy workflow
dng bng m phn 2.1, chn template l Sequential Workflow Console Application, t tn d n l FirstXAMLWFApplication.
Hnh 13.
To project FirstXAMLWFApplication
18
chng ta mun lm viv vi XAML, hy xa file workflow1 i. Sau thay th bng file nh nha workflow bng XAML: chut phi vo Solution Explorer, chn 'Add New Item' sau chn 'Sequential Workflow with Code Separation' file. 'Code Separation'.
Hnh 14.
To workflow vi m XAML
Hy sa tn file va to ra thnh MyWorkflow.xoml. Cn phi ch l file *.oml chnh l file nh ngha workflow bng XAML. Thit k workflow tng t nh phn 1.2 trn:
19
Hnh 15.
thnh phn ca workflow u c th c vit bng ngn ng xml, kh n gin k c cho nhng ngi khng chuyn v k thut lp trnh.
<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 Bi 2: Xy dng Workflow 20
<IfElseBranchActivity x:Name="ifElseBranchActivity2"> <CodeActivity x:Name="codeActivity2" ExecuteCode="codeActivity2_ExecuteCode" /> </IfElseBranchActivity> </IfElseActivity> </WhileActivity> </SequentialWorkflowActivity>
Sau , tng t nh phn 2.1, hy thit lp cc lut v cho cc activiy While Sa li file ch Program.cs nh sau gi workflow chy:
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(); } } }
21
2.3. Kt lun
Nh vy chng ta thy l vic to cc workflow bng m lp trnh v XAML u tng ng nhau. XAML c u im v bn cht n l ngn ng xml, n gin d vit bng bt c trnh son tho text n gin no v khng cn bin dch chy. Ngi khng quen vi vic lp trnh cng c th to ra cc workflow ca mnh vi cc file XAML. i vi nhng ngi xa nay quen lm vic vi cc ngn ng lp trnh nh C#, Visual Basic th vn c th lm cc workflow bng ngn ng quen thuc ca h m khng cn quan tm n dng lp trnh khai bo nh XAML. Tm li l ty thuc vo i tng ngi dng h chn phng php no thit k workflow ca h u mang li hiu qu nh nhau. Tuy nhin xu hng lp trnh khai bo vi XAML c l s tr thnh mt phong tro trong thi gian sp ti.
3. Cu hi n tp
1. Trong cc workflow, Activity l g Cc Activity (hnh ng ) l n v c bn ca chng trnh WF. Mt activity trong mt chng trnh WF biu din mt khi ca chng trnh, mt chc nng ri rc (vng lp, r nhnh, on m) 2. XOML l g? XOML (Extensible Object Markup Language) l ngn ng c t dng XML dng nh dng tun t ha cho cc i tng WF. Thc t, XOML l mt dng ca XAML, ch khc l XOML c dng lm phn m rng ca cc file nh ngha cc workflow. Khi to mt workflow vi VS.NET, n cho php ty chn nh ngha workflow bng lnh lp trnh hoc XAML, nu chn dng XAML, trnh IDE s to 2 file cho bn, 1 dng xoml (cha cch b tr workflow v cc ci t) v mt dng file m lp trnh .cs/.vb (cha m nh ngha cho cc hnh ng c th code activity trong workflow). 3. C th s dng cch no lm workflow trong WF: A. B. C. D. Cu tr li C 4. Phn m rng ca file XAML nh ngha workflow l:
Microsoft Vietnam DPE Team | WF Bi 2: Xy dng Workflow 22
S dng XAML S dng m lp trnh (C#, Visual Basic) A v B Khng c cch no trong cc cch trn
A. B. C. D. E. Cu tr li B
2. Dharma Shukla and Bob Schmidt, Essential Windows Workflow Foundation, Addison Wesley Professional 2006 3. Microsoft, Windows Workflow Foundation, URL: http://msdn2.microsoft.com/enus/netframework/aa663328.aspx
4. Microsoft, Windows Workflow Foundation Overview, URL: http://msdn.microsoft.com/en-
23