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

  • 常规讨论

  • 上篇随笔介绍了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的分类和用途。

    转自:http://www.cnblogs.com/dlwang2002/archive/2006/07/17/453272.html
    2009年5月31日 2:30