太白将进酒,共邀天下友

形位合成变动静,有无陈新映全域。 内外移思抽精明,连续离散归终果。

导航

[导入]工作流终于跑通了

按照昨天讨论的结果对工作流进行了一次改造。具体实现方式如下:

在子系统发布需要和工作流交互的事件,在工作流订阅该事件,当工作流接收到子系统的事件后会做两件事件事情,先是触发工作流引擎改变工作流状态,接着触发工作流对外发布的事件驱动流程继续流转(如果工作流还未结束),这样流程信息,工作流状态由工作流引擎管理,流转由子系统和工作流服务发布的事件一步步驱动。

把在完成门诊流程的时候遇到的问题记录一下,门诊工作流程现在只简单定义了由挂号子系统到医生工作站的流程,如图:

问题是这样的:在这一次修改前在门诊流程服务里面为WWF定义了以下几个事件:

event EventHandler<MedcialCaseEventArgs> RegistrationCreated; event EventHandler<MedcialCaseEventArgs> DiagnoseProcess; event EventHandler<MedcialCaseEventArgs> DiagnoseConfirm; event EventHandler<MedcialCaseEventArgs> RegistrationDroped;

在WWF的eventSinkActivity里配置了该事件,在这次修改中,为了更好的为事件分类,将上面的事件名字做了修改,但忘了将eventSinkActivity里面的配置做修改,wwf里面的该配置应该是通过反射动态加载,所以编译时并未报错,由此埋下隐患。运行在StartWorkflow时候异常就抛出来了,令人抓狂的System.NullReferenceException: Object reference not set to an instance of an object。通过日志慢慢检查,最后定位到流程定义文件,把眼睛瞪得老大也没检查出来问题,就是想不明白这怎么会有问题,Linkin过来一起帮检查,由于流程定义是通过WWF的设计器定义的,当时想不过就是个流程定义文件,它不像服务,根本没想过要写单元测试,这个单元测试想了想真不知道怎么写(又找借口了,唉!),最后在linkin的帮助下总算写完单元测试,运行报相同的错误,单元测试只能告诉你有错,还是没法告诉你具体错在哪,郁闷死,不得已,把流程定义删了,重新定义,加了两个节点运行,测试通过,将两个文件仔细对比,终于找到了该死的错误。修改,跑通了流程。

总结:

单元测试虽然不能帮你找到错误,但他可以避免你再犯同样的错误(上面事件名称不管怎么改,再不会担心我会忘了改流程定义里的配置),日志虽然可以帮你定位到错误,但没有单元测试,下次同样的错误还得一个个查看日志定位(太慢)。没有人能保证自己写的每一个单元测试都考虑到了所有情况,所以当出现一个问题通过日志定位后,赶紧完善单元测试,这样可以保证同样的错误不会出现第二次。想想,写全,写好单元测试还真不是件简单的事情,不断学习,慢慢积累经验吧。


文章来源:http://www.agilelabs.cn/blogs/pump/archive/2006/01/12/521.aspx

posted on 2006-01-16 10:45  太白飞仙  阅读(263)  评论(0编辑  收藏  举报