轉(zhuǎn)帖|其它|編輯:郝浩|2011-08-31 14:58:43.000|閱讀 671 次
概述:本篇我通過實(shí)例講解了如何基于XOML完成工作流的定義和創(chuàng)建。
# 界面/圖表報(bào)表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
在Workflow Foundation中,提供了多種設(shè)計(jì)工作流的方式。例如
1. 純代碼的方式(C#)
2. 代碼分離的方式(XOML+C#)
以上兩種,可以從Visual Studio提供的項(xiàng)目模板中選擇
他們在設(shè)計(jì)器中看起來是如下的
xoml是一種特殊的XML格式,它可以描述流程。例如下面這樣的一個流程
它用XOML描述的話,大致如下
<SequentialWorkflowActivity x:Class=
"WorkflowConsoleApplication1.Workflow2"
x:Name="Workflow2" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" xmlns="//schemas.microsoft.com/winfx/2006/xaml/workflow">
<CodeActivity x:Name="codeActivity1" />
<IfElseActivity x:Name="ifElseActivity1">
<IfElseBranchActivity x:Name="ifElseBranchActivity1">
<CodeActivity x:Name="codeActivity2" />
</IfElseBranchActivity>
<IfElseBranchActivity x:Name="ifElseBranchActivity2">
<CodeActivity x:Name="codeActivity3" />
</IfElseBranchActivity>
</IfElseActivity>
</SequentialWorkflowActivity>
雖然上面這樣的XML確實(shí)可以描述流程,但流程所涉及的一些特殊邏輯,則可能還是需要寫代碼。這兩個部分,最終還是需要編譯成一個類型出來。
所以,實(shí)際上上面的兩種方式?jīng)]有本質(zhì)的區(qū)別。
這里要介紹的是一種純XOML的方式:我們能不能全部用XOML來實(shí)現(xiàn)對流程的定義?如果這樣的話,我們就可以實(shí)現(xiàn)更加動態(tài)化的流程,因?yàn)槿绻嬖陬~外的代碼,就無需編譯,而是可以通過直接修改XOML文件就完成流程的修改。
答案是:可以的。但有一個前提,既然我們不想用代碼,那么流程中所使用的Activity就應(yīng)該都是可以通過配置即可完成工作的。
通常,我們需要編寫自定義Activity來實(shí)現(xiàn)這樣的需求。
例如,我們可以做一個最簡單的Activity,它只是根據(jù)用戶輸入的一個參數(shù),負(fù)責(zé)在屏幕上打印一個消息。
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Collections;
using System.Linq;
using System.Workflow.ComponentModel;
using System.Workflow.ComponentModel.Design;
using System.Workflow.ComponentModel.Compiler;
using System.Workflow.ComponentModel.Serialization;
using System.Workflow.Runtime;
using System.Workflow.Activities;
using System.Workflow.Activities.Rules;
namespace WorkflowConsoleApplication1
{
public partial class MyActivity :Activity
{
public MyActivity()
{
InitializeComponent();
}
public string Message { get; set; }
protected override ActivityExecutionStatus Execute
(ActivityExecutionContext executionContext)
{
Console.WriteLine(Message);
return base.Execute(executionContext);
}
}
}
為了演示如何直接通過XOML定義的方式使用這個自定義Activity,我們可以通過下面的代碼生成一段XOML
var workflow = new SequenceActivity();
workflow.Activities.Add(new MyActivity() { Message = "Hello,World" });
var serializer = new WorkflowMarkupSerializer();
serializer.Serialize(
XmlWriter.Create("test.xoml",new XmlWriterSettings(){CloseOutput=true}), workflow);
以上代碼的意思是,創(chuàng)建一個SequenceActivity,并且在其中添加我們自定義的這個Activity。
代碼執(zhí)行完成之后,生成的那個test.xoml的內(nèi)容如下
<?xml version="1.0" encoding="utf-8"?>
<SequenceActivity x:Name="SequenceActivity" xmlns:ns0="clr-namespace:WorkflowConsoleApplication1;
Assembly=WorkflowConsoleApplication1,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null" xmlns:x="//schemas.microsoft.com/winfx/2006/xaml" xmlns="//schemas.microsoft.com/winfx/2006/xaml/workflow">
<ns0:MyActivity Message="Hello,World" x:Name="myActivity1" />
</SequenceActivity>
這里請仔細(xì)觀察一下與之前那段xoml的區(qū)別
1. 頂層的Activity,不再包含x:Class定義。(因?yàn)楝F(xiàn)在沒有了代碼文件,Class就無從說起了)
2. 內(nèi)部所有的自定義Activity,都需要預(yù)先定義有關(guān)的namespace,引用到它們所在的Assembly
3. 自定義Activity的設(shè)置,直接通過屬性完成
那么,如何利用上面這樣的定義,去創(chuàng)建并運(yùn)行流程呢?
var instance2 = workflowRuntime.CreateWorkflow(
XmlReader.Create("test.xoml"));
instance2.Start();
如果我們需要修改流程定義,則直接可以修改那個XOML文件,而無需編譯程序。例如我們將Message修改為“Hello,Workflow”
則運(yùn)行結(jié)果如下
其實(shí),只要我們愿意,我們甚至可以將這些定義的字符串保存在愛數(shù)據(jù)庫中,然后通過下面代碼創(chuàng)建并啟動流程
var definition ="<?xml version=\"1.0\"
encoding=\"utf-8\"?><SequenceActivity x:Name=
\"SequenceActivity\" xmlns:ns0=\"clr-namespace:
WorkflowConsoleApplication1;Assembly=
WorkflowConsoleApplication1,
Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null\" xmlns:x=
\"//schemas.microsoft.com/winfx/2006/xaml\" xmlns=
\"//schemas.microsoft.com/winfx/2006/xaml/workflow\">
<ns0:MyActivity Message=\"Hello,Workflow\" x:Name=\"myActivity1\" />
</SequenceActivity>";
//這里還可以從數(shù)據(jù)庫將該定義讀取出來
var reader = XmlReader.Create(new StringReader(definition));
var workflow = workflowRuntime.CreateWorkflow(reader);
workflow.Start();
【總結(jié)】
本篇我通過實(shí)例講解了如何基于XOML完成工作流的定義和創(chuàng)建。
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@fc6vip.cn
文章轉(zhuǎn)載自:博客園