最近公司要求将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);
}
}
}
流程设计器上只需要通过设置调用的类名和方法名称即可。