创建一个简单的workflow工作流(WF4)

1.初始化数据库在C:\Windows\Microsoft.NET\Framework\v4.0.30319\SQL\en目录下查找SqlWorkflowInstanceStoreSchema.sql和SqlWorkflowInstanceStoreLogic.sql这两个文件,在希望持久化的数据库里先执行SqlWorkflowInstanceStoreSchema.sql再执行,这样数据库初始化就完成了。2.引用System.Activityes,System.Activities.DurableInstanceing,System.Runtime.DurableInstancing 三个dll并且在操作workflow的类里引用,using System.Activities.DurableInstancing;在不引用System.Activityies.DurableInstanceing的时候一样可以引用,但是必须引用了这个dll,SqlWorkflowInstanceStore类才有效。3.1创建WorkflowHelp类。这个类主要用来操作Workflow,如持久化和加载已经持久化的记录。首先声明 private static SqlWorkflowInstanceStore _instanceStore; public static SqlWorkflowInstanceStore InstanceStore { get { if (_instanceStore == null) { _instanceStore = new SqlWorkflowInstanceStore(connString); }

return _instanceStore; } }定义一个SqlWorkflowInstanceStore实例,这个是类是为了持久化的

3.2.持久化实例当提交一个申请的时候需要把该记录持久化到数据库InstanceView view = InstanceStore.Execute(InstanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));Execute是异步持久化到数据库第一个参数是实例句柄,第二个参数是需要执行的命令,第三个参数是持久化数据库超时时间,返回值为InstanceView视图,包括持久化的数据的实例数据(摘自MSDN)

InstanceStore.DefaultInstanceOwner = view.InstanceOwner;设置实例的默认所有者,SqlWorkflowInstanceStore默认只使用单一的WorkflowApplication.当使用多个工作流的时候会发生一个异常,SqlWorkflowInstanceStore does not support creating more than one lock owner concurrently. Consider setting InstanceStore.DefaultInstanceOwner to share the store among many applications.当设置这个属性的时候不会有这个问题了。如果确认只有一个工作流时也必须把DefaultInstanceOwner设置为Null,否则垃圾回收器可能不会回收这块内存。(MSND说的是可能)注意 如果这个属性不设置则不可以持久化,如果设置了则不可以用同一个SqlWorkflowInstanceStore来创建,也就是说 public static SqlWorkflowInstanceStore InstanceStore { get { if (_instanceStore == null) { _instanceStore = new SqlWorkflowInstanceStore(connString); }

return _instanceStore; } }这句话是不完全对的,只有在application.Run()后,加上InstanceStoreObj = null,下次创建的时候重新实例化才可以连续创建,,原因不明,有时间再看。IDictionary<string, object> input = new Dictionary<string, object> { { "SubmitInValue" , approveInfo } };

WorkflowApplication application = new WorkflowApplication(new AuthFlow(), input);为工作流的单个实力提供宿主。其中AuthFlow是画的工作流图,input是输入参数,如果不需要参数则也可以不用input.关于input参数对于自定义的控件,可能需要里面执行一些逻辑,如把一些页面参数存储进数据库,这个时候在初始化宿主的时候就需要把参数传进数据库。首先需要在AuthFlow页面定义一个变量“SubmitInValue”,类型为“ApproveInfo”也就是需要更新到数据库里的实体,在定义控件的时候声明一个 public InArgument<ApproveInfo> AssignedTo { get; set; } 属性,在AuthFolwo图上选择CreateApply在属性里就可以看到AssingedTo属性,把属性的值设置为AuthFlow页面上刚才定义的"SubmitInValue",这样在程序执行到这里的时候就会把页面的input变量传到控件里。input的第一个参数必须是在AuthFlow里定义的那个,否则无法找到。application.InstanceStore = InstanceStore; 设置一个对象,提供ApplicationWorkf对工作流应用程序状态的访问(MSDN)application.PersistableIdle = (e) => { return PersistableIdleAction.Unload; };当工作流处于空闲状态时触发的动作,PersistableIdleAction的成员,None不做任何动作,Unload保持并卸载,Persist保持

可偏偏。多么温柔,一出口便是相互指责和嘲讽。

创建一个简单的workflow工作流(WF4)

相关文章:

你感兴趣的文章:

标签云: