子工作流在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); }
}
这个解决方案实际上是可行的。但是我不确定在这个子工作流中持久性是如何处理的,以及当子工作流完成时父工作流是如何继续的。
我的问题是:
- 是否有任何方法调用SubWorkflow Activities与context.ScheduleActivity(…)如果活动实际上没有添加
metadata.AddImplementationChild(subWorkflow)
- 如果你使用WorkflowInstance类,持久性是如何处理的,如果子工作流完成,如何继续父工作流。
我是这样解决我的问题的:
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);
}
}
}
}
}