详解WF4.0中工作流设计器的配置与使用

开发 后端
本文将对大家讲解的是WF4.0中工作流设计器的配置与使用,希望对大家了解WF 4.0 Beta有所帮助。

本文将为大家讨论的是WF4.0中工作流设计器的配置与使用,希望本文能让大家在WF的开发工作中能更加得心应手。

#T#

在WF3.0里面,就能将工作流设计器宿主到你自己的应用程序中,但是除了做一些基本的操作,做一些复杂的操作将非常的难。

在WF4.0中应用移植性变得更好,只需200行代码就能创建一个功能完全也非常有用的工作流设计器。WF 4.0中新增加的工作流服务功能,可以直接把工作流发布为WCF服务,当然工作流也必须设计为具有WCF应答功能才行。4.0提供4个与WCF相关的活动:Receive、ReceiveReply、Send、SendReply,通过这些活动可以可视化定义WCF的服务操作。
 

工作流设计器

WorkflowDesigner

WorkflowDesigner是工作流设计器运行的主类。它通过View属性给出了实际的设计界面。通过PropertyInspectorView属性给出了相关属性。如果宿主在WPF中,这两个属性准备给WPF UIElement使用,很容易将他们添加到表单上。加载和保存一个工作流也非常容易,需要Load() 和 Save()函数,它们需要使用一个XAML文件做参数。部分代码如下:

  1. _workflowDesigner = new WorkflowDesigner();  
  2. _workflowDesigner.Load(_fileName);  
  3. var view = _workflowDesigner.View;  
  4. Grid.SetColumn(view, 1);  
  5. Grid.SetRow(view, 1);  
  6. LayoutGrid.Children.Add(view);  
  7. var propInspector = _workflowDesigner.PropertyInspectorView;  
  8. Grid.SetColumn(propInspector, 2);  
  9. Grid.SetRow(propInspector, 1);  
  10. LayoutGrid.Children.Add(propInspector);  
  11. DesignerMetadata: 
另外一件需要做的事情是注册流程活动设计的metadata;它只是一个简单的调用,但是如果舍弃它,就意味着所有活动都只是一个收起的小图像,也不可能扩展。
 
 
  1. new DesignerMetadata().Register(); 
 

 将Activity显示在工具栏上

左边的工具栏使用另外一个标准的WPF控件:ToolboxControl。它也非常容易添加到WPF的表单上面。将Activity的类型添加ToolboxItemWrapper。这样,不需要做其它工作,就能将Activity直接拖放到设计界面上。在下面的代码只是通过扫描几个程序集得到所有Activity类型,如果它是有效的Activity,我们就将它添加到工具栏上。

  1. var toolbox = new ToolboxControl();  
  2. var cat = new ToolboxCategory("Standard Activities");  
  3. var assemblies = new List<Assembly>();  
  4. assemblies.Add(typeof(Send).Assembly);  
  5. assemblies.Add(typeof(Delay).Assembly);  
  6. assemblies.Add(typeof(ReceiveAndSendReplyFactory).Assembly);  
  7. var query = from asm in assemblies  
  8.             from type in asm.GetTypes()  
  9.             where type.IsPublic &&  
  10.             !type.IsNested &&  
  11.             !type.IsAbstract &&  
  12.             !type.ContainsGenericParameters &&  
  13.             (typeof(Activity).IsAssignableFrom(type) ||  
  14.             typeof(IActivityTemplateFactory).IsAssignableFrom(type))  
  15.             orderby type.Name  
  16.             select new ToolboxItemWrapper(type);  
  17. query.ToList().ForEach(ti => cat.Add(ti));  
  18. toolbox.Categories.Add(cat);  
  19. Grid.SetColumn(toolbox, 0);  
  20. Grid.SetRow(toolbox, 1);  
  21. LayoutGrid.Children.Add(toolbox); 

当前的selection

在表单的顶部,我显示当前选择的activity和它的父Activity。WorkflowDesigner有一个项目集合,里面有一组有用的对象。其中有一个就是Selection 对象,我们可以周期性地检查此Selection,使用Subscribe()函数和在一个handler中传递,当selection改变的时候就会触发,这样可能更容易实现。

  1. _workflowDesigner.Context.Items.Subscribe<Selection>(SelectionChanged); 
 
 

Handler一样也不复杂:

  1. private void SelectionChanged(Selection selection)  
  2. {  
  3.     var modelItem = selection.PrimarySelection;  
  4.     var sb = new StringBuilder();  
  5.     while (modelItem != null)  
  6.     {  
  7.         var displayName = modelItem.Properties["DisplayName"];  
  8.         if (displayName != null)  
  9.         {  
  10.             if (sb.Length > 0)  
  11.                 sb.Insert(0, " - ");  
  12.             sb.Insert(0, displayName.ComputedValue);  
  13.         }  
  14.         modelItem = modelItem.Parent;  
  15.     }  
  16.     CurrentActivityName.Text = sb.ToString();  

验证workflow

让用户知道设计的工作流是否有效是非常完美的事情。这也非常简单,在WorkflowDesigner services中添加一个IValidationErrorService。在这个例子中,我在表单上添加一个listbox。让IValidationErrorService将每项错误添加到ListBox项中。不需要去调用任何函数,一旦工作流有改变,IValidationErrorService会被自动的调用。

  1. var validationErrorService = new ValidationErrorService(WorkflowErrors.Items);  
  2. _workflowDesigner.Context.Services.Publish<IValidationErrorService>(validationErrorService); 
 
IValidationErrorService由一个简单的函数组成。将错误写在一个参数列表中。
  1. public class ValidationErrorService : IValidationErrorService  
  2. {  
  3.     private IList _errorList;  
  4.     public ValidationErrorService(IList errorList)  
  5.     {  
  6.         _errorList = errorList;  
  7.     }  
  8.     public void ShowValidationErrors(IList<ValidationErrorInfo> errors)  
  9.     {  
  10.         _errorList.Clear();  
  11.         foreach (var error in errors)  
  12.         {  
  13.             _errorList.Add(error.Message);  
  14.         }  
  15.     }  
运行workflow:
为了运行工作流,我添加一些代码,使用WorkflowApplication来运行工作流。加载也非常容易,ActivityXamlServices.Load()需要传递一个文件来调用。它会返回一个DynamicActivity。
 
  1. var writer = new StringWriter();  
  2. var workflow = ActivityXamlServices.Load(_fileName);  
  3. var wa = new WorkflowApplication(workflow);  
  4. wa.Extensions.Add(writer);  
  5. wa.Completed = WorkflowCompleted;  
  6. wa.OnUnhandledException = WorkflowUnhandledException;  
  7. wa.Run(); 
 
 
 

原文标题:WF4.0工作流设计器

 

链接:http://www.cnblogs.com/zhuqil/archive/2010/01/13/1646771.html

 

【责任编辑:彭凡 TEL:(010)68476606】

责任编辑:彭凡 来源: 博客园
相关推荐

2009-06-17 10:51:58

WF4.0规则引擎

2009-10-28 09:23:27

WF4.0 Beta2

2009-03-03 09:13:36

工作流BPM业务流程

2009-04-15 11:00:31

Workflow工作流角色

2009-10-30 09:04:18

WF4 Beta2

2010-01-14 14:12:14

Visual Stud

2010-02-01 09:19:32

WF 4.0

2009-11-18 09:14:49

Visual Stud

2009-06-22 09:36:06

WF 4.0 beta跟踪配置

2021-10-14 11:34:05

技术工作流引擎

2017-04-05 10:06:59

工作流界面抽象组件

2015-07-14 09:26:28

微型工作流引擎设计

2020-08-06 08:16:26

Kubernetes架构开源

2020-08-06 08:26:22

Kubernetes架构开发

2012-07-23 10:36:46

工作流

2023-01-04 08:02:16

工作流架构设计

2009-06-15 10:20:47

WF 4.0 Beta跟踪机制

2009-07-16 10:41:40

WF 4.0 beta

2021-03-12 06:44:09

Argo Workfl开源项目

2023-08-02 18:48:23

Flowable工作流引擎
点赞
收藏

51CTO技术栈公众号