如何在Microsoft Workflow中的另一个Activity中调用Activity?

时间:2016-03-17 18:21:34

标签: c#-4.0 workflow-foundation-4

我创建了一个Native活动,我需要在Bookmark Resume调用上调用另一个活动。我的第一个活动名称是“Apply”,第二个活动叫做“Approve”。在Apply中,我创建了一个属性,如下所示。

  public Approve Approve
    {
        get;
        set;
    }

然后我已经注册了CacheMetadata,如下所示。

        metadata.AddImplementationChild(this.Approve);
        base.CacheMetadata(metadata);

然后是“OnResumeBookmark”方法,我正在安排它。

        this.Approve = new Approve();
        this.Approve.ID = context.GetValue(this.ID);
        OutArgument<string> res = this.Approve.Result;
        context.ScheduleActivity(this.Approve);

但是当它运行时,它会给我以下错误。

在处理元数据时,提供的活动不是此工作流定义的一部分。名为“Approve”的有问题的活动由名为“Apply”的活动提供。

你能帮我解决一下吗?

1 个答案:

答案 0 :(得分:0)

活动开发有两种方法:

  • 私人执行路线
  • 公共实施路线

您的问题似乎正在处理私人实施策略,但我会在下面提供以下两种方式的示例代码。

  

私人执行方式

在此方法中,Apply活动负责设置有关Approve子活动的所有内容。我们使用WF ID对象连接Variable<string>属性。另外,我们告知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!");
    }
}
  

公共实施方式

开发活动的第二种方法是定义Apply活动,以便只安排Approve活动。 CacheMetadata方法需要对此进行轻微调整,方法是使用AddChild方法而不是AddImplementationChild方法。

public class Apply : NativeActivity
{
    public Apply()
    {
    }

    public Approve Approve { get; set; }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddChild(this.Approve);
    }

    protected override void Execute(NativeActivityContext context)
    {
        context.ScheduleActivity(this.Approve, this.OnApprovalCompleted);
    }

    private void OnApprovalCompleted(NativeActivityContext activityContext, ActivityInstance instance)
    {
        Console.WriteLine("Apply succeeded!");
    }
}

要执行&#34;公共实施方式&#34;,它将如下所示:

class Program
{
    static void Main(string[] args)
    {
        WorkflowInvoker.Invoke(new Sequence()
        {
            Activities =
            {
                new Apply()
                {
                    Approve = new Approve()
                    {
                        Something = "Hello World!"
                    }
                }
            }
        });
    }
}