Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 4.0 如何在Microsoft工作流中调用另一个活动中的活动?_C# 4.0_Workflow Foundation 4 - Fatal编程技术网

C# 4.0 如何在Microsoft工作流中调用另一个活动中的活动?

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);

我创建了一个本机活动,需要在书签恢复通话中调用另一个活动。我的第一个活动名为“申请”,第二个活动名为“批准”。在Apply中,我创建了一个属性,如下所示

  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!"
                    }
                }
            }
        });
    }
}