VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 编程开发 > Objective-C编程 >
  • WF状态机事件详细步骤

制作者:剑锋冷月 单位:无忧统计网,www.51stat.net
 

  在WF状态机的State活动中,都是从事件活动开始,通过callExternalMethod活动调用方法来执行需要执行的业务.

  在工作流创建时候,我们可以通过参数的方式将工作流需要的共有数据传递给工作流,这样工作流可以任何时候访问这些数据(通过工作流属性实现了数据的get和set)。

  工作流的CreateWorkflow方法:

public WorkflowInstance CreateWorkflow (Type workflowType,Dictionary<string, Object> namedArgumentValues)

  参数namedArgumentValues就是我们需要的参数,可以这样组装namedArgumentValues参数:

  Dictionary<string, object> namedArgumentValues= new Dictionary<string, object>();=      

  namedArgumentValues.Add("UserId", userId);

  namedArgumentValues.Add("Xml", xml);     

  namedArgumentValues.Add("OrderId", orderId);

  通过传参的方式只能在工作流创建的时候将数据写入,在工作流重新被load后,没有办法给工作流实例(WorkflowInstance)添加参数或者写入数据。但是在实际业务中每个业务操作都可能需要传入一些数据,比如订单审批人,审批金额等,这样就出现了我在开发中遇到的问题,如何给工作流实例传递值?

  大概的解决思路在关于wf中传参的问题:如何在workflow实例钝化后重新load时传参! 做了说明。

  第一步:创建自定义事件类,比如OrderDataEventArgs,创建自定义事件类的时候需要注意两点:首先要继承ExternalDataEventArgs,另外就是要添加序列化声明

[Serializable]
  publicclassOrderDataEventArgs:ExternalDataEventArgs
  {
    privatestringcorpIdValue;
    privatestringuserIdValue;
    privateintstampDateValue;
    privatestringorderIdValue;
    privatestringxmlValue;
    publicOrderDataEventArgs(GuidinstanceId,stringcorpId,stringuserId,intstampDate)
      :base(instanceId)
    {
      orderIdValue=instanceId.ToString();
      corpIdValue=corpId;
      userIdValue=userId;
      stampDateValue=stampDate;
      //xmlValue=xml;
      WaitForIdle=true;
    }
    publicOrderDataEventArgs(GuidinstanceId,stringcorpId,stringuserId,stringxml)
      :base(instanceId)
    {
      orderIdValue=instanceId.ToString();
      corpIdValue=corpId;
      userIdValue=userId;
      xmlValue=xml;
      WaitForIdle=true;
    }
    publicstringOrderId
    {
      get{returnorderIdValue;}
      set{orderIdValue=value;}
    }
    publicstringCorpId
    {
      get{returncorpIdValue;}
      set{corpIdValue=value;}
    }
    publicstringUserId
    {
      get{returnuserIdValue;}
      set{userIdValue=value;}
    }
    publicintStampDate
    {
      get{returnstampDateValue;}
      set{stampDateValue=value;}
    }
    publicstringXml
    {
      get{returnxmlValue;}
      set{xmlValue=value;}
    }
  }

编缉推荐阅读以下文章

  • WF 操作指导: 使用 Windows Workflow Foundation 构建状态机
  • WF学习系列之五:状态机工作流学习
  • 坚持学习WF(15):状态机工作流
 

  第二步:在状态机中添加OrderDataEventArgs类型的属性:

publicstaticDependencyPropertyOrderEventArgsProperty=DependencyProperty.Register("OrderEventArgs",typeof(OrderDataEventArgs),typeof(Workflow1));
    [DescriptionAttribute("OrderEventArgs")]
    [CategoryAttribute("OrderEventArgsCategory")]
    [BrowsableAttribute(true)]
    [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
    publicOrderDataEventArgsOrderEventArgs
    {
      get
      {
        return((OrderDataEventArgs)(base.GetValue(Workflow1.OrderEventArgsProperty)));
      }
      set
      {
        base.SetValue(Workflow1.OrderEventArgsProperty,value);
      }
    }

  然后将HandleExternalEventActivity活动事件e参数绑定到上面定义的OrderDataEventArgs属性,这样就能通过事件将需要的数据传递给工作流

  设置过程图片:

WF 状态机 事件传参详细步骤

  e参数绑定到OrderDataEventArgs属性的代码如下,这是通过属性设置生成的代码:

//
      //handleExternalEventActivity1
      //
      this.handleExternalEventActivity1.EventName="Create";
      this.handleExternalEventActivity1.InterfaceType=typeof(WorkflowInterface.IOrder);
      this.handleExternalEventActivity1.Name="handleExternalEventActivity1";
      activitybind1.Name="Workflow1";
      activitybind1.Path="OrderEventArgs";
      workflowparameterbinding1.ParameterName="e";
      workflowparameterbinding1.SetBinding(System.Workflow.ComponentModel.WorkflowParameterBinding.ValueProperty,((System.Workflow.ComponentModel.ActivityBind)(activitybind1)));
      this.handleExternalEventActivity1.ParameterBindings.Add(workflowparameterbinding1);
      this.handleExternalEventActivity1.Invoked+=newSystem.EventHandler<System.Workflow.Activities.ExternalDataEventArgs>(this.handleExternalEventActivity1_Invoked);

编缉推荐阅读以下文章

  • WF 操作指导: 使用 Windows Workflow Foundation 构建状态机
  • WF学习系列之五:状态机工作流学习
  • 坚持学习WF(15):状态机工作流
 

  第三步:为callExternalMethodActivity活动的方法绑定参数,在IOrder接口中,SaveOrder方法需要两个参数:OrderId,UserId,这两个参数的值来自OrderEventArgsProperty 属性。

  图片:

WF 状态机 事件传参详细步骤

  代码:

//
      //callExternalMethodActivity1
      //
      this.callExternalMethodActivity1.InterfaceType=typeof(WorkflowInterface.IOrder);
      this.callExternalMethodActivity1.MethodName="SaveOrder";
      this.callExternalMethodActivity1.Name="callExternalMethodActivity1";
      activitybind1.Name="Workflow1";
      activitybind1.Path="OrderEventArgs.OrderId";
      workflowparameterbinding1.ParameterName="orderId";
      workflowparameterbinding1.SetBinding(System.Workflow.ComponentModel.WorkflowParameterBinding.ValueProperty,((System.Workflow.ComponentModel.ActivityBind)(activitybind1)));
      activitybind2.Name="Workflow1";
      activitybind2.Path="OrderEventArgs.UserId";
      workflowparameterbinding2.ParameterName="userId";
      workflowparameterbinding2.SetBinding(System.Workflow.ComponentModel.WorkflowParameterBinding.ValueProperty,((System.Workflow.ComponentModel.ActivityBind)(activitybind2)));
      this.callExternalMethodActivity1.ParameterBindings.Add(workflowparameterbinding1);
      this.callExternalMethodActivity1.ParameterBindings.Add(workflowparameterbinding2);

编缉推荐阅读以下文章

  • WF 操作指导: 使用 Windows Workflow Foundation 构建状态机
  • WF学习系列之五:状态机工作流学习
  • 坚持学习WF(15):状态机工作流
 

  OrderEventArgsProperty 属性数据传递的媒介,客户端组装OrderDataEventArgs,通过事件发送给工作流,工作流执行CallExternalMethodActivity的方法。

  下面是关于工作流接口和实现的代码:

[ExternalDataExchange]
  publicinterfaceIOrder
  {
    ///<summary>
    ///创建订单
    ///</summary>
    eventEventHandler<OrderDataEventArgs>Create;
    ///<summary>
    ///确认订单
    ///</summary>
    eventEventHandler<OrderDataEventArgs>Confirm;
    ///<summary>
    ///完成
    ///</summary>
    eventEventHandler<OrderDataEventArgs>Complete;
    voidSaveOrder(stringorderId,stringuserId);
    
  
  }
  
[Serializable]
  publicclassOrder:IOrder
  {
    publicvoidRaiseCreateEvent(OrderDataEventArgsargs)
    {
      if(Create!=null)
      {
        Create(null,args);
      }
    }
    publicvoidRaisConfirmEvent(OrderDataEventArgsargs)
    {
      if(Confirm!=null)
      {
        Confirm(null,args);
      }
    }
    publicvoidRaisCompleteEvent(OrderDataEventArgsargs)
    {
      if(Complete!=null)
      {
        Complete(null,args);
      }
    }
    #regionIOrderMembers
    publiceventEventHandler<OrderDataEventArgs>Create;
    publiceventEventHandler<OrderDataEventArgs>Confirm;
    publiceventEventHandler<OrderDataEventArgs>Complete;   
    publicvoidSaveOrder(stringorderId,stringuserId)
    {
      //得到通过OrderDataEventArgs传递的数据
      Console.WriteLine("OrderIdvalue{0},UserIdvalue{1}",orderId,userId);
    }
    #endregion
  }

编缉推荐阅读以下文章

  • WF 操作指导: 使用 Windows Workflow Foundation 构建状态机
  • WF学习系列之五:状态机工作流学习
  • 坚持学习WF(15):状态机工作流
 

  最后一步:调用代码:

WorkflowHelperworkflowHelper;
    OrderOrderEx;
    publicForm1()
    {
      InitializeComponent();
      OrderEx=newOrder();
      workflowHelper=newWorkflowHelper(OrderEx);
    }
    GuidInstanceId=newGuid("74E512AA-AC75-45a1-8818-0F77C8670AB4");
    stringuserId="F8E05185-3A4B-48c8-8C37-3B4EBD03B7AA";
    stringcorpId="b5d183ab-dc95-4fdd-a7ad-562822047ce6";
    privatevoidbtnCreate_Click(objectsender,EventArgse)
    {
      workflowHelper.LoadWorkflow(InstanceId);     
      
      OrderDataEventArgsea=newOrderDataEventArgs(InstanceId,corpId,userId,"");
      ea.WaitForIdle=true;
      
      OrderEx.RaiseCreateEvent(ea);
      workflowHelper.LoadWorkflow(InstanceId);
    }
    privatevoidbtnConfirm_Click(objectsender,EventArgse)
    {
      //InstanceId=newGuid(textBox1.Text);     
      workflowHelper.LoadWorkflow(InstanceId);
      OrderDataEventArgsea=newOrderDataEventArgs(InstanceId,corpId,userId,1);
      ea.WaitForIdle=true;
      OrderEx.RaisConfirmEvent(ea);
     
      workflowHelper.LoadWorkflow(InstanceId); 
    }

编缉推荐阅读以下文章

  • WF 操作指导: 使用 Windows Workflow Foundation 构建状态机
  • WF学习系列之五:状态机工作流学习
  • 坚持学习WF(15):状态机工作流
 

  第二步:在状态机中添加OrderDataEventArgs类型的属性:

publicstaticDependencyPropertyOrderEventArgsProperty=DependencyProperty.Register("OrderEventArgs",typeof(OrderDataEventArgs),typeof(Workflow1));
    [DescriptionAttribute("OrderEventArgs")]
    [CategoryAttribute("OrderEventArgsCategory")]
    [BrowsableAttribute(true)]
    [DesignerSerializationVisibilityAttribute(DesignerSerializationVisibility.Visible)]
    publicOrderDataEventArgsOrderEventArgs
    {
      get
      {
        return((OrderDataEventArgs)(base.GetValue(Workflow1.OrderEventArgsProperty)));
      }
      set
      {
        base.SetValue(Workflow1.OrderEventArgsProperty,value);
      }
    }

  然后将HandleExternalEventActivity活动事件e参数绑定到上面定义的OrderDataEventArgs属性,这样就能通过事件将需要的数据传递给工作流

  设置过程图片:

WF 状态机 事件传参详细步骤

  e参数绑定到OrderDataEventArgs属性的代码如下,这是通过属性设置生成的代码:

//
      //handleExternalEventActivity1
      //
      this.handleExternalEventActivity1.EventName="Create";
      this.handleExternalEventActivity1.InterfaceType=typeof(WorkflowInterface.IOrder);
      this.handleExternalEventActivity1.Name="handleExternalEventActivity1";
      activitybind1.Name="Workflow1";
      activitybind1.Path="OrderEventArgs";
      workflowparameterbinding1.ParameterName="e";
      workflowparameterbinding1.SetBinding(System.Workflow.ComponentModel.WorkflowParameterBinding.ValueProperty,((System.Workflow.ComponentModel.ActivityBind)(activitybind1)));
      this.handleExternalEventActivity1.ParameterBindings.Add(workflowparameterbinding1);
      this.handleExternalEventActivity1.Invoked+=newSystem.EventHandler<System.Workflow.Activities.ExternalDataEventArgs>(this.handleExternalEventActivity1_Invoked);


相关教程