看了好几天的工作流了,最终也没把demo做出来,但是例子主要说得什么还都是懂得差不多了。反正要写博客,凑一篇吧。
首先,什么是工作流,为什么会出现工作流。
百度百科我就不复制了,说说我的理解,以前我们做系统的时候都是“这个业务流程,那个业务流程”这么的说的,现在我们根据面向对象的思想,将业务和流程分开,这个流程抽象出来就是工作流。以前好像是听宏杰说的工作流就是一个传送带,对传送带的操作,比如,第一个业务是往传送带上放一个瓶子,第二个业务是给瓶子里面灌上水,第三个业务是给瓶子一个盖子。差不多就是这样吧,我自己是用烧烤理解的,穿肉的木签就是工作流,吃肉就穿肉,吃菜就穿菜。
理解嘛,反正就是这个样子,死命的往自己熟悉的理解上靠,靠不过去了就发现了不合适的地方了,这样老师说过的异同点就全都出来了。
然后说一下代码吧,目前还有一些部分不太懂,只能说说自己的想法。
这个WFPCase的shenmegui,其实用法跟我们用的SQLhelper是一个道理,SQLhelper把增删改查抽象出了4个常用的方法,而这个WFPCase主要抽象了创建工作流和重启工作流这两个方法。不如改名叫WFHelper~
我一个一个说吧,CSDN编辑器不好玩,就按照注释随便写了。
首先这个为工作流数据库持久化准备,这个主要是保存我们工作流一些信息,讲课的时候呢,说得数据库中保存,下一个页面的URL,接收人信息,什么什么的,我们就把这个看做书签,相当于真正看书的书签看书看到的页数。而这几句话说得是这个书签是什么做的,什么颜色,谁做的,哪天做的。。。别的就不知道保存的什么了,差不多我现在的理解就这些了吧。
创建流程实例传入参数,这个就是我说的相当于SQLHelper的地方,我们把SQL语句,参数,执行的SQL语句类型都传给SQLhelper,让他去做。这里就是把工作流要传的业务数据放在Dictionary里面,然后页面URL也都一起传下去
关联数据库这里是把我们创建的这个数据流和我们刚才在数据库中保存的那些看不懂的工作流数据一一对应上。
回调这里暂时没用,我们这次先不说了。后面添加追踪,这个追踪使我们的另外一个数据库,这里面保存的是工作流流到哪了,应该谁去执行了,下一个页面该显示什么了,这种信息。
最后就是执行和等待了。
<span style="white-space:pre"> </span>/// <summary>
/// 创建工作流
/// </summary>
/// <param name="strProcessKey"></param>
public void CreateAndRun()
{
//流程数据库持久化对象准备
SqlWorkflowInstanceStore instanceStore = new SqlWorkflowInstanceStore("server=192.168.24.233;database=countersignatureDB;uid=sa;pwd=123456");
InstanceView view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(10));
instanceStore.DefaultInstanceOwner = view.InstanceOwner;
Activity activity = WorkflowFactory.CreateWorkFlow(strProcessKey);
//创建流程实例并传入参数
WorkflowApplication application = new WorkflowApplication(
activity, //根据key,通过工厂创建流程对象
new Dictionary<string, object>(){
{"dic", inDic}, //参数名
{"handler", handler}, //参数名
{"formURL", formUrl}, //参数名
{"formCreator", strCurrentUser}, //参数名
});
//关联流程对象到数据库(countersignatureDB中的InstancesTable表)
application.InstanceStore = instanceStore;
#region 回调事件
//工作流进入空闲状态时触发
application.PersistableIdle = (e) =>
{
return PersistableIdleAction.Unload;
};
//内存卸载工作流实例时触发
application.Unloaded = (e) =>
{
instanceUnloaded.Set();
};
//卸载时发生异常触发
application.OnUnhandledException = (ex) =>
{
Console.Write("Exception");
return UnhandledExceptionAction.Terminate;
};
#endregion
添加一个追踪拓展
//application.Extensions.Add(new SaveAllEventsToTestFileTrackingParticipant());
ApplicationManager applicationManager = new ApplicationManager();
processInstance.ID = application.Id.ToString();
processInstance.Status = WorkflowStatus.Running.ToString();
processInstance.CreateTime = DateTime.Now.ToString();
processInstance.ProcessName = activity.DisplayName;
processInstance.UserID = strCurrentUser;
applicationManager.Add(processInstance);
//将工作流实例保留到实例存储区
application.Persist();
//流程开始执行
application.Run();
instanceUnloaded.WaitOne();
}
恩,差不多启动就这些东西了,不懂的地方还有不少,比如参数中有一个Handler,就不太清楚是干吗的,现在我的想法就是,这个是要执行的业务逻辑,在实例化这个WFPCase的时候用一个委托将要执行的业务逻辑传给工作流,这样就成了工作流去执行业务了。
对于昨天的一些问题,比如能不能动态配置这种,回来想了一下,既然URL是一个参数,那么这个参数就可以在使用读取配置文件的方式去改,那样就可以实现不用改代码就更该工作流的流程了。
还有,这个工作流要使用哪一个“图”,是我们要指定的,现在是用一个工厂去创建的,这种时候应该可以用反射实现,不过就是不知道这样效率怎么样- -
好了,没了,剩下的肯定是要继续研究的。
植树节少跟树过不去,出门不买吃树和补刀斧了~
以上