通過XOML或者XAML的方式建立和啟動工作流

2022-07-29 08:36:08 字數 2881 閱讀 4452

在workflow foundation中,提供了多種設計工作流的方式。例如

純**的方式(c#)

**分離的方式(xoml+c#)

以上兩種,可以從visual studio提供的專案模板中選擇

他們在設計器中看起來是如下的

xoml是一種特殊的xml格式,它可以描述流程。例如下面這樣的乙個流程

它用xoml描述的話,大致如下

ifelsebranchactivity>

ifelsebranchactivity>

ifelseactivity>

sequentialworkflowactivity>

雖然上面這樣的xml確實可以描述流程,但流程所涉及的一些特殊邏輯,則可能還是需要寫**。這兩個部分,最終還是需要編譯成乙個型別出來。

所以,實際上上面的兩種方式沒有本質的區別。

這裡要介紹的是一種純xoml的方式:我們能不能全部用xoml來實現對流程的定義?如果這樣的話,我們就可以實現更加動態化的流程,因為如果存在額外的**,就無需編譯,而是可以通過直接修改xoml檔案就完成流程的修改

答案是:可以的。但有乙個前提,既然我們不想用**,那麼流程中所使用的activity就應該都是可以通過配置即可完成工作的

通常,我們需要編寫自定義activity來實現這樣的需求。

例如,我們可以做乙個最簡單的activity,它只是根據使用者輸入的乙個引數,負責在螢幕上列印乙個訊息。

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;

public string message

protected override activityexecutionstatus execute(activityexecutioncontext executioncontext)}}

為了演示如何直接通過xoml定義的方式使用這個自定義activity,我們可以通過下面的**生成一段xoml

var workflow = new sequenceactivity();

workflow.activities.add(new myactivity() );

var serializer = new workflowmarkupserializer();

serializer.serialize(

xmlwriter.create("test.xoml",new xmlwritersettings()), workflow);

以上**的意思是,建立乙個sequenceactivity,並且在其中新增我們自定義的這個activity。

**執行完成之後,生成的那個test.xoml的內容如下

sequenceactivity>

這裡請仔細觀察一下與之前那段xoml的區別

頂層的activity,不再包含x:class定義。(因為現在沒有了**檔案,class就無從說起了)

內部所有的自定義activity,都需要預先定義有關的namespace,引用到它們所在的assembly

自定義activity的設定,直接通過屬性完成

那麼,如何利用上面這樣的定義,去建立並執行流程呢?

var instance2 = workflowruntime.createworkflow(

xmlreader.create("test.xoml"));

instance2.start();

如果我們需要修改流程定義,則直接可以修改那個xoml檔案,而無需編譯程式。例如我們將message修改為「hello,workflow」

則執行結果如下

其實,只要我們願意,我們甚至可以將這些定義的字串儲存在愛資料庫中,然後通過下面**建立並啟動流程

//這裡還可以從資料庫將該定義讀取出來

var reader = xmlreader.create(new stringreader(definition));

var workflow = workflowruntime.createworkflow(reader);

workflow.start();

剛剛發現的 xaml裡面顏色的定義方式

例如 其中,sc 為關鍵字,sca,scr,scg,scb為介於0.0 1.0的single值。第乙個引數1 透明度 第二個引數0.5 紅色的比例,最小0,最大1 第三個引數0.8 綠色的比例,最小0,最大1 第四個引數1 藍色的比例,最小0,最大1 其實只是把之前的十六進製制表示,換成為小數表示。...

剛剛發現的 xaml裡面顏色的定義方式

例如 其中,sc 為關鍵字,sca,scr,scg,scb為介於0.0 1.0的single值。第乙個引數1 透明度 第二個引數0.5 紅色的比例,最小0,最大1 第三個引數0.8 綠色的比例,最小0,最大1 第四個引數1 藍色的比例,最小0,最大1 其實只是把之前的十六進製制表示,換成為小數表示。...

Git add多個檔案或者目錄的方式

方法一 git add 新增多個檔案,檔案之間以空格隔開 git add file1 file2 file3方法二 多次git add git add file1 git add file2 git add file2方法三 新增指定目錄下的檔案 config目錄下及子目錄下所有檔案,home目錄下...