WF4小試牛刀之用外部方法替代事件方法

最近公司要求將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);
                }
            }
        }


 流程設計器上只需要通過設置調用的類名和方法名稱即可。


 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章