動態更新活動條件

2021-08-29 17:33:06 字數 3771 閱讀 3862

活動的條件有兩種:**條件和宣告性規則條件。如果我們改變了**條件我們需要重新編譯我們的工作流程式才可以。由於宣告行規則條件是序列化到.rules檔案中的,所以我們可以動態的更新,下面舉例說明:

我們建立乙個順序型工作流控制台程式,工作流設計如下圖:

然後分別設定分支條件(均為宣告性規則條件)如下:

ifelsebranchactivity1:條件名--ifbranch1,表示式--this.conditonnum == 1。

ifelsebranchactivity2:條件名--ifbranch2,表示式--this.conditonnum == 2。

工作流**如下:

using system;

using system.componentmodel;

using system.componentmodel.design;

using system.collections;

using system.drawing;

using system.linq;

using system.workflow.componentmodel.compiler;

using system.workflow.componentmodel.serialization;

using system.workflow.componentmodel;

using system.workflow.componentmodel.design;

using system.workflow.runtime;

using system.workflow.activities;

using system.workflow.activities.rules;

namespace caryupdatecondition

public int conditonnum

private void codeactivity1_executecode(object sender, eventargs e)

private void codeactivity2_executecode(object sender, eventargs e)

private void codeactivity3_executecode(object sender, eventargs e)}}

我們設計宿主程式如下:
static void main(string args)

; workflowruntime.workflowterminated += delegate(object sender, workflowterminatedeventargs e)

;workflowruntime.workflowcreated += new

eventhandler

(workflowruntime_workflowcreated);

console.writeline("--第乙個工作流執行開始--");

dictionary

argnum= new

dictionary

();argnum.add("conditonnum", 1);

workflowinstance instance = workflowruntime.createworkflow(typeof

(caryupdatecondition.conditonworkflow),argnum);

instance.start();

waithandle.waitone();

console.writeline("--第乙個工作流執行結束--");

console.writeline();

console.writeline("--第二個工作流執行開始--");

dictionary

argnum2 = new

dictionary

();argnum2.add("conditonnum", 2);

workflowinstance instance2 = workflowruntime.createworkflow(typeof

(caryupdatecondition.conditonworkflow), argnum2);

instance2.start();

waithandle.waitone();

console.writeline("--第二個工作流執行結束--");}}

如果這個時候我們執行工作流,和我們以前的沒什麼區別,程式會執行codeactivity1和codeactivity2,我們現在要在執行時動態更改活動的條件,什麼時候做更新我們在wf中的動態更新 一文有詳細的說明。我們註冊workflowruntime的created事件。在該事件中做更改。**如下:

private static 

boolean firstwf = true;

private static void modifyrules(workfloweventargs e)

",ex.message);}}

else}}

}firstwf = false;

}

現在我們再次執行程式,由於我們在上面的程式中將ifelsebranchactivity1的條件this.conditonnum == 1。右面

的表示式改為了0,結果如下:

我們在上面的程式中在執行時對ifelsebranchactivity1的條件做了更改,從結果中也看到更改生效,我們還可以在

執行時替換整個.rules檔案,這樣我們就可以在外部集中管理工作流的規則條件,我們現在將原來的自動生成的.rules

檔案拷貝乙份,重名為replacerules.rules,然後把該檔案中以下部分做更改,同樣是將ifelsebranchactivity1

的條件this.conditonnum == 1,右面的表示式改為了0:

<

ns0:codebinaryoperatorexpression.right

>

<

ns0:codeprimitiveexpression

>

<

ns0:codeprimitiveexpression.value

>

<

ns1:int32

xmlns:ns1

="clr-namespace:system;assembly=mscorlib, version=2.0.0.0,

culture=neutral, publickeytoken=b77a5c561934e089">0

ns1:int32

>

ns0:codeprimitiveexpression.value

>

ns0:codeprimitiveexpression

>

ns0:codebinaryoperatorexpression.right

>

實際中我們不會這樣做,我們會通過規則編輯器來設定我們的規則,我們在執行時替換該規則檔案,程式如下:

private static void replacerules(workfloweventargs e)

",ex.message);}}

else

}

}

}firstwf = false;

}

執行程式後我們會得到和上面同樣的結果。

entity framework 動態條件

entity framework 動態條件 問題 在實際編碼過程中,根據不同的選擇情況,會需要按照不同的條件查詢資料集 如 狀態confirmstatus 如果為空的時候,查詢全部,如果有具體值的時候,查詢相應的值 同時還有其他條件,外來鍵編號 task 等等。這個時候,需要根據條件的值來判斷是否增...

動態規劃 活動選擇問題

乙個遞迴解 設c i j 為sij中最大相容子集中的活動數目,當sij為空集時,c i j 0 當sij非空時,若ak在sij的最大相容子集中被使用,則則問題sik和skj的最大相容子集也被使用,故可得到c i j c i k c k j 1。當i j時,sij必定為空集,否則sij則需要根據上面提...

動態規劃 活動選擇問題

乙個遞迴解 設c i j 為sij中最大相容子集中的活動數目,當sij為空集時,c i j 0 當sij非空時,若ak在sij的最大相容子集中被使用,則則問題sik和skj的最大相容子集也被使用,故可得到c i j c i k c k j 1。當i j時,sij必定為空集,否則sij則需要根據上面提...