Workflow Foundation中LocalService服务类的改进

  最近在项目中开始使用Workflow Foundation,使用状态机在asp.net下实现工作流。在Samples中看到的示例都是在LocalService服务类项目中加入各种事件来触发状态改状态的改变。但在实际项目中,我认为这种方法通用性不强,原因有三:一是每次流程发生变化时都需要更新LocalService;二是无法实现通用的自定义Activities;三是在asp.net的页面代码中需要根据当前状态触发不同的事件,但实际上理想的情况是,页面代码只需要通知状态机状态需要改变,具体如何改变、改变成何状态都不是页面代码关心的(当然这可以通过在web.config中配置状态与事件的对应关系来实现)。
  下面是我对LocalService服务类的改进想法。
  实际上我想实现的是,外界只通知状态机需要改变状态并且可以传参数给状态机,具体如何改变,改变为何状态都由状态机自己处理。
  做过状态机工作流的兄弟都知道,之所以LocalService要随状态机的变化而改变是因为Samples中的示例告诉我们,要为每一个状态写一个Trigger,然后在外部根据状态机当前的状态触发相应的Trigger来驱动状态机改变状态。我的想法是,只做一个WFEventTrigger,然后把每个状态的handleExternal中的EventName都设为统一的WFEventTrigger。在每个状态的handleExternal中加入一个ifElseBranchActivity,condition是callme
private bool callme()
{
return this.tUserData["CurrentState"].ToString() == this.CurrentStateName;
}
this.tUserData["CurrentState"].ToString() 是在页面代码中送过来的参数,内容是在外部取到的状态机的当前状态。
  这样就可以在外部使用通用的代码来触发状态改变。LocalService也不需要随状态机的变化而改变了。

  希望能够和大家交流一下这么做有什么优缺点,谢谢!
posted @ 2007-06-14 12:37  申健  阅读(2018)  评论(5编辑  收藏  举报