最近公司要求將WF3開發的系統升級到WF4上,順便做成一個審批類的項目,以後就用她來應付公司其他項目的審批模塊。前一段時間有幸參加了VS10新特性的簡單培訓。想直接通過工具升級到WF4的朋友,估計夢想要破滅了。據瞭解WF3和WF4是兩個不同的產品。寡人不信邪,後來裝上VS10打開項目結果發現之前的類庫都沒了,代碼紅色警告一大片。無奈之下開始學習WF4的用法。想跟牛人學習WF的猛擊這裏;經過一段山寨式的學習, 終於要上手了。用過3的難友應該深有體會,4的編寫方式是改動最大的。老是思想紊亂,想在Invoked裏面寫點什麼的。真愧當年沒學WF之前先學個乾坤大挪移什麼的,這時候自廢武功,從新吸收WF4,豈不美哉。扯遠了,講講跟標題相關的東東吧:)
WF4不支持xaml後臺cs文件。也就是說不支持在流程文件中編寫業務邏輯代碼。WF4的設計思想就是業務與代碼完全分離(想寫也沒門,繞個道還是可以滴,O(∩_∩)O~)。我們之前寫的審批前、審批中、審批後事件要怎麼處理呢?給微軟的哥們發信,回覆也肯定了xaml文件不能配合cs文件一起使用。要麼寫xmal文件將三個事件獨立成三個自定義活動,組合起來使用;要麼寫純代碼的workflow。本來一個自定義活動解決的問題,反而複雜成了三個活動,影響性能不說,還不好看(我們的客戶可是要看流程圖的)。用純代碼的workflow,那還不如將就WF3呢。兩種方式皆不可,幸虧寡人還知道C#有個反射的玩意。廢話少說,直接呈上Code 。
/// <summary>
/// 調用外部審批前方法
/// </summary>
/// <param name="context"></param>
/// <param name="agrs"></param>
public void CallExternalApprovingMethod(System.Activities.NativeActivityContext context, ApprovingEventArgs agrs)
{
string sApprovingMethod = context.GetValue(this.ApprovingMethod);
Type approvingClass = context.GetValue(this.ApprovingClass);
// 類名和方法名稱非空
if (approvingClass != null&&!string.IsNullOrEmpty(sApprovingMethod))
{
System.Reflection.MethodInfo method = approvingClass.GetMethod(sApprovingMethod);
if (method != null)
{
// 方法參數
object[] oParams = new object[] { this, agrs };
// 執行方法
method.Invoke(null, oParams);
}
}
}
/// <summary>
/// 調用外部審批中方法
/// </summary>
/// <param name="context"></param>
/// <param name="agrs"></param>
public void CallExternalApproveMethod(System.Activities.NativeActivityContext context, ApproveEventArgs agrs)
{
string sApproveMethod = context.GetValue(this.ApproveMethod);
Type approveClass = context.GetValue(this.ApproveClass);
// 類名和方法名稱非空
if (approveClass != null && !string.IsNullOrEmpty(sApproveMethod))
{
System.Reflection.MethodInfo method = approveClass.GetMethod(sApproveMethod);
if (method != null)
{
// 方法參數
object[] oParams = new object[] { this, agrs };
// 執行方法
method.Invoke(null, oParams);
}
}
}
/// <summary>
/// 調用外部審批後方法
/// </summary>
/// <param name="context"></param>
/// <param name="agrs"></param>
public void CallExternalApprovedMethod(System.Activities.NativeActivityContext context, ApprovedEventArgs agrs)
{
string sApprovedMethod = context.GetValue(this.ApprovedMethod);
Type approvedClass = context.GetValue(this.ApprovedClass);
// 類名和方法名稱非空
if (approvedClass != null && !string.IsNullOrEmpty(sApprovedMethod))
{
System.Reflection.MethodInfo method = approvedClass.GetMethod(sApprovedMethod);
if (method != null)
{
// 方法參數
object[] oParams = new object[] { this, agrs };
// 執行方法
method.Invoke(null, oParams);
}
}
}
流程設計器上只需要通過設置調用的類名和方法名稱即可。