现在的位置: 首页 > 综合 > 正文

Windows Workflow Foundation (二): 例子中的几个概念

2011年08月18日 ⁄ 综合 ⁄ 共 2205字 ⁄ 字号 评论关闭
上篇随笔介绍了WWF的基本概念,主要是那个层次,以及每个层次的功能和模块。
这次,就通过一些小例子来展示一下WWF的这些概念的意义,主要解释的是Host和WWF的运行模型。
然后,在详细解释Activity和工作流类型。

WWF可创建的项目类型有:
Console Application;
WindowsForm Application;
WebForm Application;
Windows Service等。关于WebService的使用,后边介绍。

我们先通过一个Console Application来看看WWF的内容。
创建方法:
1:打开vs2005,创建一个Workflow项目,选择ConsoleApplication那个模版。
2:在给出的Sequential workflow设计界面里(Sequential和State的区别,看上一篇Windows Workflow Foundation (一): 基本概念),加上一个CodeActivity(Activity的内容后边将陆续写出)。
3:在codeActivity的CodeBehind里面写这样的处理
     Console.WriteLine("Hello,World");  //怎么又是Hello,World?而不是Hello,Roy?
4:启动Workflow的代码。
       _workflowRuntime = new System.Workflow.Runtime.WorkflowRuntime("WorkflowRuntime");
        try
        {
            _workflowRuntime.StartRuntime();
        }
        catch
        {    }

看看,这里面已经出现了WWF的好几个内容了。
首先,程序模版(网上多的是,应该很好理解)。
然后,Activity,活动,WWF处理商务逻辑的核心。这里出现了一个CodeActivity,用来写一些代码处理,这些处理当然被包含在WWF里面了。 可以看到设计器的另外一个新特性:如果有些参数没有填写,它会给出提示,在设计期间。
后边是WorkflowRuntime。他将在自己的处理空间里面进行处理----马上就要讲到这个处理空间的一些问题。里面的参数是WebConfig中配置的WWF的名字,例如:
 <configSections>
    <section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net"/>
    <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
  </configSections>

上边这个例子可能还不过瘾,再看一个复杂一点的windows workflow foundation在WebApplication中的应用,使用StateMechineWorkflow 。主要是看看里面的设计步骤和内容。
在这个例子里,我们可以看到
1:WWF的Runtime,配置,启动,这里是运行wwf的基础。上边也有简单的提到
2:数据对象DocumentService和带有ExternalDataExchange继承的事件
3:一个WWF对象:商务的流程
4:WWF的Host:使用wwf的程序

这个例子的解释在那里已经有了,这里要解释的概念就是 运行空间
“Workflows run in their own context,a context that inckides data and execution,so they naturally run in a separate thread from the host”

Host一个运行空间,比方说WebForm或者WinForm的运行空间;而WWF的运行则在另外一个程序空间(他有自己的Context上下文)。
这个的意思就是说,Host处理空间和WWF处理空间(Thread,这个翻译可能有问题)不一样,他们之间有通讯的问题。
大家可能都知道关于程序域之间的通讯,这个类似。

Host空间为了触发WWF处理空间里面的处理,就得通过事件这种方式来进行沟通,这就是DocumentService存在的意义,这就是他为什么要能Serializable(为了序列化/反序列化,在不同空间传递该对象)。

同样的道理,如果想让WWF里面的Activity访问Host里面控件(比方说修改WinForm窗体中的一个按钮的Text属性),就成了在另外一个Tread来访问Win窗体,线程不安全,所以,你得使用这样的方式来访问:
theFrom.Button1.Invoke(....);

为了解决数据交换,WWF里面有专门的几个Activity来做这项工作,他们是UpdateData;SelectData;WaitForData;WaitForQuery。后边将详细介绍这四个Activity。

下一篇将详细介绍Activity的分类和用途。

抱歉!评论已关闭.