zoukankan      html  css  js  c++  java
  • 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);
                    }
                }
            }


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



  • 相关阅读:
    信步漫谈之Struts2—输入校验(编码方式)
    信步拾遗之Java反射机制浅析
    信步漫谈之Log4j—基础介绍
    Log4J基础详解及示例大全(转)
    设计模式之Bridge(桥接)(转)
    设计模式之Adapter(适配器)(转)
    设计模式之Facade(外观)(转)
    设计模式之Factory(工厂)(转)
    设计模式之Flyweight(享元)(转)
    基于CentOS7系统部署cobbler批量安装系统
  • 原文地址:https://www.cnblogs.com/yizhuqing/p/WF_ExternalMethodReplaceEventMethod.html
Copyright © 2011-2022 走看看