詳解WF4.0中工作流設(shè)計器的配置與使用
本文將為大家討論的是WF4.0中工作流設(shè)計器的配置與使用,希望本文能讓大家在WF的開發(fā)工作中能更加得心應(yīng)手。
#T#
在WF3.0里面,就能將工作流設(shè)計器宿主到你自己的應(yīng)用程序中,但是除了做一些基本的操作,做一些復(fù)雜的操作將非常的難。
在WF4.0中應(yīng)用移植性變得更好,只需200行代碼就能創(chuàng)建一個功能完全也非常有用的工作流設(shè)計器。WF 4.0中新增加的工作流服務(wù)功能,可以直接把工作流發(fā)布為WCF服務(wù),當(dāng)然工作流也必須設(shè)計為具有WCF應(yīng)答功能才行。4.0提供4個與WCF相關(guān)的活動:Receive、ReceiveReply、Send、SendReply,通過這些活動可以可視化定義WCF的服務(wù)操作。
WorkflowDesigner
WorkflowDesigner是工作流設(shè)計器運(yùn)行的主類。它通過View屬性給出了實(shí)際的設(shè)計界面。通過PropertyInspectorView屬性給出了相關(guān)屬性。如果宿主在WPF中,這兩個屬性準(zhǔn)備給WPF UIElement使用,很容易將他們添加到表單上。加載和保存一個工作流也非常容易,需要Load() 和 Save()函數(shù),它們需要使用一個XAML文件做參數(shù)。部分代碼如下:
另外一件需要做的事情是注冊流程活動設(shè)計的metadata;它只是一個簡單的調(diào)用,但是如果舍棄它,就意味著所有活動都只是一個收起的小圖像,也不可能擴(kuò)展。
- _workflowDesigner = new WorkflowDesigner();
- _workflowDesigner.Load(_fileName);
- var view = _workflowDesigner.View;
- Grid.SetColumn(view, 1);
- Grid.SetRow(view, 1);
- LayoutGrid.Children.Add(view);
- var propInspector = _workflowDesigner.PropertyInspectorView;
- Grid.SetColumn(propInspector, 2);
- Grid.SetRow(propInspector, 1);
- LayoutGrid.Children.Add(propInspector);
- DesignerMetadata:
- new DesignerMetadata().Register();
將Activity顯示在工具欄上
左邊的工具欄使用另外一個標(biāo)準(zhǔn)的WPF控件:ToolboxControl。它也非常容易添加到WPF的表單上面。將Activity的類型添加ToolboxItemWrapper。這樣,不需要做其它工作,就能將Activity直接拖放到設(shè)計界面上。在下面的代碼只是通過掃描幾個程序集得到所有Activity類型,如果它是有效的Activity,我們就將它添加到工具欄上。
- var toolbox = new ToolboxControl();
- var cat = new ToolboxCategory("Standard Activities");
- var assemblies = new List<Assembly>();
- assemblies.Add(typeof(Send).Assembly);
- assemblies.Add(typeof(Delay).Assembly);
- assemblies.Add(typeof(ReceiveAndSendReplyFactory).Assembly);
- var query = from asm in assemblies
- from type in asm.GetTypes()
- where type.IsPublic &&
- !type.IsNested &&
- !type.IsAbstract &&
- !type.ContainsGenericParameters &&
- (typeof(Activity).IsAssignableFrom(type) ||
- typeof(IActivityTemplateFactory).IsAssignableFrom(type))
- orderby type.Name
- select new ToolboxItemWrapper(type);
- query.ToList().ForEach(ti => cat.Add(ti));
- toolbox.Categories.Add(cat);
- Grid.SetColumn(toolbox, 0);
- Grid.SetRow(toolbox, 1);
- LayoutGrid.Children.Add(toolbox);
當(dāng)前的selection
在表單的頂部,我顯示當(dāng)前選擇的activity和它的父Activity。WorkflowDesigner有一個項(xiàng)目集合,里面有一組有用的對象。其中有一個就是Selection 對象,我們可以周期性地檢查此Selection,使用Subscribe()函數(shù)和在一個handler中傳遞,當(dāng)selection改變的時候就會觸發(fā),這樣可能更容易實(shí)現(xiàn)。
- _workflowDesigner.Context.Items.Subscribe<Selection>(SelectionChanged);
Handler一樣也不復(fù)雜:
- private void SelectionChanged(Selection selection)
- {
- var modelItem = selection.PrimarySelection;
- var sb = new StringBuilder();
- while (modelItem != null)
- {
- var displayName = modelItem.Properties["DisplayName"];
- if (displayName != null)
- {
- if (sb.Length > 0)
- sb.Insert(0, " - ");
- sb.Insert(0, displayName.ComputedValue);
- }
- modelItem = modelItem.Parent;
- }
- CurrentActivityName.Text = sb.ToString();
- }
驗(yàn)證workflow
讓用戶知道設(shè)計的工作流是否有效是非常完美的事情。這也非常簡單,在WorkflowDesigner services中添加一個IValidationErrorService。在這個例子中,我在表單上添加一個listbox。讓IValidationErrorService將每項(xiàng)錯誤添加到ListBox項(xiàng)中。不需要去調(diào)用任何函數(shù),一旦工作流有改變,IValidationErrorService會被自動的調(diào)用。
- var validationErrorService = new ValidationErrorService(WorkflowErrors.Items);
- _workflowDesigner.Context.Services.Publish<IValidationErrorService>(validationErrorService);
- public class ValidationErrorService : IValidationErrorService
- {
- private IList _errorList;
- public ValidationErrorService(IList errorList)
- {
- _errorList = errorList;
- }
- public void ShowValidationErrors(IList<ValidationErrorInfo> errors)
- {
- _errorList.Clear();
- foreach (var error in errors)
- {
- _errorList.Add(error.Message);
- }
- }
- }
- var writer = new StringWriter();
- var workflow = ActivityXamlServices.Load(_fileName);
- var wa = new WorkflowApplication(workflow);
- wa.Extensions.Add(writer);
- wa.Completed = WorkflowCompleted;
- wa.OnUnhandledException = WorkflowUnhandledException;
- wa.Run();
原文標(biāo)題:WF4.0工作流設(shè)計器
鏈接:http://www.cnblogs.com/zhuqil/archive/2010/01/13/1646771.html
【責(zé)任編輯:彭凡 TEL:(010)68476606】