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);
                }
            }
        }


 流程设计器上只需要通过设置调用的类名和方法名称即可。



原文地址:https://www.cnblogs.com/yizhuqing/p/WF_ExternalMethodReplaceEventMethod.html