WWF中宿主程序(即调用工作流的程序)和工作流内部交换数据的几种方法(情况)。

一、在工作流启动时,向工作流内部参数:(特点是:只能在工作流启动时传入数据。)

这个比较简单,只需

在文章http://blog.csdn.net/xjzdr/archive/2008/06/06/2516102.aspx中的第二部分有详细的说明:

大概是:

(1)在Workflow1.cs文件中,定义属性:

 

 public string STRNAME        

 {           

  get { return strName; }            

 set { strName = value;}     

    }

(2)定义Dictionary对象,如:

 

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

然后给这个Dictionary加入参数和传入的数据。

注意:加入的参数名称要和工作流中的参数名称一样。

(3)在工作流实例创建的CreateWorkflow方法中,加入Dictionary对象。

完整的一个启动代码如下:

using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; // using System.Workflow.Runtime;//在项目中添加 System.Workflow.Runtime 引用 using System.Workflow.Activities;///在项目中添加 System.Workflow.Activities 引用                                  using System.Workflow.ComponentModel;

namespace WindowsApplication1 {     public partial class Form1 : Form     {         public Form1()         {             InitializeComponent();         }         private WorkflowRuntime wr;

        private void button1_Click(object sender, EventArgs e)         {             if (wr == null)             {

                wr = new WorkflowRuntime();

                wr.StartRuntime();

            }

 

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

            parameters.Add("STRNAME", this.textBox1.Text);

            parameters.Add("STRQQ", this.textBox2.Text);

 

            WorkflowInstance instance = wr.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1), parameters);

            instance.Start();//启动工作流

 

        }     } }

二、在工作流内部调用外部方法(包括带参数和不带参数的方法):

(1)定义一个接口IWWFDEMO,在接口IWWFDEMO中定义方法,在另一个类中(必须继承自该接口)进行方法的具体实现。

为了方便,我将接口的定义和方法的具体实现放在一个CS文件中,完整的WWFDEMO.cs代码如下:

using System; using System.Collections.Generic; using System.Text; using System.Workflow.Activities;

namespace WorkflowLibrary4 {     /// <summary>     /// 定义工作流服务接口     /// </summary>     [System.Workflow.Activities.ExternalDataExchange]     public interface IWWFDEMO//定义接口     {

        //定义两个方法,其中一个有参数,一个没有参数         void CreateBallot1();//调用程序输入的将QQ号通过外部方法传入工作流中,并在工作流中打印出来         void CreateBallot2(string StrQQ);     }        /// <summary>     /// 实现类     /// </summary>     public class WWFDEMO : IWWFDEMO     {         public void CreateBallot1()         {             Console.WriteLine("Bollot created for {0}.");         }         public void CreateBallot2(string myqq)         {             Console.WriteLine("Bollot2 created for ", myqq);         }

    } }

定义了两个方法,其中一个有输入参数,另一个没有输入参数。

 

(2)设置WWF。

工作流中,使用callExternalMethodActivity来调用外部的方法。

设置效果如下:

放置了两个callExternalMethodActivity,分别用于调用外部的CreateBallot1和CreateBallot2方法。CODEActivity用于输出接收的参数。

分别设置这两个callExternalMethodActivity的InterFaceType属性和MethodName属性。

InterFaceType属性为:WorkflowLibrary4.IWWFDEMO

MethodName分别为两个方法名称。

其中,因为 CreateBallot2带有一个参数,因此,在属性窗口中,会出现一个方法的属性,如图:

运行到callExternalMethodActivity2时,将会把输入的参数传入,并保存在StrQQ1中,因此,在下面的CodeActivity中,就可以调用该参数了。

codeActivity1的执行代码如下:

 private void codeActivity1_ExecuteCode(object sender, EventArgs e)         {             Console.WriteLine(this.StrQQ1.ToString());         }

(3)调用WWF的宿主程序:

 private void button1_Click(object sender, EventArgs e)         {             WorkflowRuntime workflowRuntime = new WorkflowRuntime();             //为工作流添加参数             Dictionary<string, object> parameters = new Dictionary<string, object>();             parameters.Add("StrQQ1", "ABC");//此名称必须和WF中参数的名称完全一样才行。             //为工作流添加数据交换服务

            System.Workflow.Activities.ExternalDataExchangeService dataService = new ExternalDataExchangeService();             workflowRuntime.AddService(dataService);

            //实例化服务内容             WorkflowLibrary4.WWFDEMO votingservice = new WorkflowLibrary4.WWFDEMO();

            dataService.AddService(votingservice);             workflowRuntime.StartRuntime();             //调用工作流             WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary4.Workflow1), parameters);

            instance.Start();         }

说明:

调用外部的方法和事件时,必须使用ExternalDataExchangeService 进行方法和事件的交互。

MSDN中对此的解释是:

ExternalDataExchangeService 类

表示一个必须添加到工作流运行时引擎才能启用本地服务通信的服务。若要正确地初始化和注册这些服务,必需将本地服务实现添加到 ExternalDataExchangeService

运行效果:

 

 

private string strName;        
posted on 2008-06-23 23:00  晃晃悠悠  阅读(396)  评论(0)    收藏  举报