上篇隨筆介紹了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的程式
這個例子的解釋在那裡已經有了,這裡要解釋的概念就是 Runspace。
“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一個Runspace,比方說WebForm或者WinForm的Runspace;而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的分類和用途。