放假之前接了个大活,说是要把工作流做活,做到登陆的学生提交申请,提交给老师,这个老师是根据组织结构查出来的。
其实这个是基础系统自己的逻辑,查询数据而已,当时并没有多放多少精力在这上面。重点是另外一个,怎么把工作流执行的业务做灵活,具体要求就是改变绑定的业务时,不要改代码,起码不要改基础内部的代码。
这个就感觉不简单了,查了一些工作流的资料,所有的绑定都是通过页面拖拽完成的,让我做一个这个出来好像是有点难度啊。
然后,师姐把难度给我降低了,可以用配置文件做灵活。
配置文件这个难度确实小了好多,这个时候我就想到了反射。之前写了篇博客,说是反射可以获得程序集中的所有的信息,然后就能实现动态配置。
首先看看之前的代码吧,这里有一句
wfpCaseInstance.Handler = StudentChange.AddStudentChange
这句就是我的工作重点,首先就是如何用反射获得这个方法的信息,然后就是把这个方法创建一个委托,最后传过来。
//使用反射读取要执行的方法
Assembly assemblyName = Assembly.Load(ConfigurationManager.AppSettings["assembly"].ToString()); //读取程序集
Type classname = assemblyName.GetType(ConfigurationManager.AppSettings["className"].ToString()); //读取类
MethodInfo methodName = classname.GetMethod(ConfigurationManager.AppSettings["methodName"].ToString()); //读取方法
//创建一个委托,类型为工作流中的CodeActiveExecuting,方法信息为读取配置文件生成的方法
CodeActiveExecuting handler =(CodeActiveExecuting)Delegate.CreateDelegate(typeof(CodeActiveExecuting),null, methodName);
wfpCaseInstance.Handler = handler; //将创建的委托传给工作流
配置文件中,写的是程序集,类,方法的名称。
<!--工作流执行的业务-->
<add key="assembly" value="ITOO.BasicStudentClient" /> <!--程序集-->
<add key="className" value="ITOO.Basic.Client.Workflow.ConnectionWorkflow.ConnectionWorkFlowManager" /> <!--类-->
<add key="methodName" value="AddStudentChange" /> <!--要执行的业务方法-->
这样就实现了最简单的灵活了,中间创建委托困扰了好久,下次好好总结一下委托。