C# 4.0 如何在Microsoft工作流中调用另一个活动中的活动?
我创建了一个本机活动,需要在书签恢复通话中调用另一个活动。我的第一个活动名为“申请”,第二个活动名为“批准”。在Apply中,我创建了一个属性,如下所示C# 4.0 如何在Microsoft工作流中调用另一个活动中的活动?,c#-4.0,workflow-foundation-4,C# 4.0,Workflow Foundation 4,我创建了一个本机活动,需要在书签恢复通话中调用另一个活动。我的第一个活动名为“申请”,第二个活动名为“批准”。在Apply中,我创建了一个属性,如下所示 public Approve Approve { get; set; } 然后我注册了缓存元数据,如下所示 metadata.AddImplementationChild(this.Approve); base.CacheMetadata(metadata);
public Approve Approve
{
get;
set;
}
然后我注册了缓存元数据,如下所示
metadata.AddImplementationChild(this.Approve);
base.CacheMetadata(metadata);
然后是“OnResumeBookmark”方法,Im调度它
this.Approve = new Approve();
this.Approve.ID = context.GetValue(this.ID);
OutArgument<string> res = this.Approve.Result;
context.ScheduleActivity(this.Approve);
this.Approve=newapprove();
this.Approve.ID=context.GetValue(this.ID);
OutArgument res=this.Approve.Result;
context.ScheduleActivity(this.Approve);
但是当它运行时,它给了我下面的错误
处理其元数据时,提供的活动不是此工作流定义的一部分。名为“批准”的有问题活动是由名为“应用”的活动提供的。
你能帮我解决这个问题吗 活动开发有两种方法:
- 私有实现路径
- 公共实施路线
Apply
活动负责设置有关Approve
子活动的所有内容。我们使用WF变量
对象连接ID
属性。此外,我们还通知WF运行时,Approve
活动可以通过Apply
活动安排,就像您在代码示例中所做的那样
public class Approve : CodeActivity
{
public InArgument<string> Something
{
get; set;
}
protected override void Execute(CodeActivityContext context)
{
var message = string.Format("Approval of {0} in process... please wait.", this.Something.Get(context));
Console.WriteLine(message);
}
}
public class Apply : NativeActivity
{
private readonly Approve approve;
private readonly Variable<string> thingToApproveVar;
public Apply()
{
this.thingToApproveVar = new Variable<string>();
this.approve = new Approve();
this.approve.Something = new InArgument<string>(this.thingToApproveVar);
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
metadata.AddImplementationVariable(this.thingToApproveVar);
metadata.AddImplementationChild(this.approve);
}
protected override void Execute(NativeActivityContext context)
{
Console.WriteLine("Approving...");
this.thingToApproveVar.Set(context, "Hello");
context.ScheduleActivity(this.approve, this.OnApprovalCompleted);
}
private void OnApprovalCompleted(NativeActivityContext activityContext, ActivityInstance instance)
{
Console.WriteLine("Apply succeeded!");
}
}
要执行“公共实施方式”,如下所示:
class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(new Sequence()
{
Activities =
{
new Apply()
{
Approve = new Approve()
{
Something = "Hello World!"
}
}
}
});
}
}
谢谢你的回复。让我试试这个,然后再打给你。作为一种解决方法,我当时做的是在APPLY和callapprove中创建一个“workflowapplication”。它起作用了。但是,我打电话给一个Rest服务。在rest调用完成之前,它将转到处于APPLY中的已完成代理:(您是否正在[Apply]活动中创建[WorkflowApplication]?这不是一个好主意。我建议提出另一个问题(或更新此问题)使用示例代码的场景,我们可以更好地了解您要完成的任务。我认为我把事情复杂化了。我可以将两个活动按顺序进行,并在它们之间添加书签,而不是从一个活动调用一个活动。我已经试过了,效果很好。感谢您的帮助。
class Program
{
static void Main(string[] args)
{
WorkflowInvoker.Invoke(new Sequence()
{
Activities =
{
new Apply()
{
Approve = new Approve()
{
Something = "Hello World!"
}
}
}
});
}
}