子工作流在Windows工作流基础和持久性

本文关键字:工作流 持久性 Windows | 更新日期: 2023-09-27 18:06:15

我有一个自定义Activity,应该根据InArgument中传递的名称调用子工作流。

公共类callsubworkflowactivity: NativeActivity{

public InArgument<String> SelectedWorkflow { get; set; }
protected override void Execute(NativeActivityContext context)
{
   Activity subWorkflow = ActivityFactory.CreateActivity(SelectedWorkflow.Get(context));
   context.ScheduleActivity(activity); 
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
} 

}

我的首选解决方案是使用context.ScheduleActivity调用子活动。这不起作用,因为我不能在CacheMeta(context)中添加metadata.AddImplementationChild(subWorkflow),因为我在这一点上没有访问InArguments。

一个解决方案是通过访问CacheMetadata中的InArguments来绕过这个问题。但这不是一个应该实施的解决方案。

我想到的另一个解决方案是使用WorkflowInstance或WorkflowInvoker来执行子工作流活动。

callsubworkflowactivity: NativeActivity {公共InArgument SelectedWorkflow {get;设置;}
protected override void Execute(NativeActivityContext context)
{
   Activity subWorkflow = ActivityFactory.CreateActivity(SelectedWorkflow.Get(context));
   WorkflowApplication wfInstance = new WorkflowApplication(subWorkflow);

}

}

这个解决方案实际上是可行的。但是我不确定在这个子工作流中持久性是如何处理的,以及当子工作流完成时父工作流是如何继续的。

我的问题是:

  1. 是否有任何方法调用SubWorkflow Activities与context.ScheduleActivity(…)如果活动实际上没有添加metadata.AddImplementationChild(subWorkflow)
  2. 如果你使用WorkflowInstance类,持久性是如何处理的,如果子工作流完成,如何继续父工作流。

子工作流在Windows工作流基础和持久性

我是这样解决我的问题的:

 protected override void CacheMetadataInternal(System.Activities.NativeActivityMetadata metadata)
        {
            InArgument<String> workflowVersionArgument = SelectedWorkflow;
            if (workflowVersionArgument != null && workflowVersionArgument.Expression != null)
            {
                String selectedWorkflowString = workflowVersionArgument.Expression.ToString();
                if (selectedWorkflowString != null)
                {
                    WorkflowVersion wfVersion = WorkflowVersion.LoadFromXML(selectedWorkflowString);
                    if (wfVersion != null && wfVersion.WorkflowName != null)
                    {
                        VersionedActivity subWorkflow = ActivityFactory.Instance.CreateActivity(wfVersion.WorkflowName, wfVersion.Version);
                        if (subWorkflow != null && subWorkflow.ActivityProp != null)
                        {
                            subWorkflowInternal = subWorkflow.ActivityProp;
                            metadata.AddImplementationChild(subWorkflowInternal);
                        }
                    }
                }
            }
        }