C# 在NativeActivity内计划接收活动

C# 在NativeActivity内计划接收活动,c#,workflow-foundation-4,C#,Workflow Foundation 4,在我的工作流服务中,我有一个包含大量方法的接口。所有这些都已使用“导入服务合同…”选项转化为可用的活动 生成的活动很好,但我想让它们的使用更加简单。现在我需要记住设置相关处理程序,如果我只忘记了一个,有时很难找到哪个Receive活动出错 因此,我想在我的Receive活动周围创建一个NativeActivity包装器,该包装器将带有[RequiredAttribute]标志集的inagrament,使事情变得简单明了 这就是我所处的位置: public sealed class TestAct

在我的工作流服务中,我有一个包含大量方法的接口。所有这些都已使用“导入服务合同…”选项转化为可用的活动

生成的活动很好,但我想让它们的使用更加简单。现在我需要记住设置相关处理程序,如果我只忘记了一个,有时很难找到哪个
Receive
活动出错

因此,我想在我的
Receive
活动周围创建一个
NativeActivity
包装器,该包装器将带有
[RequiredAttribute]
标志集的
inagrament
,使事情变得简单明了

这就是我所处的位置:

public sealed class TestActivity : NativeActivity
{
    [RequiredArgument]
    public InArgument<CorrelationHandle> Handle { get; set; }
    [RequiredArgument]
    public InArgument<XName> ServiceContractName { get; set; }

    private Receive OnCGTaskCreate { get; set; }
    private Variable<CorrelationHandle> HandleVariable { get; set; }

    public TestActivity()
    {
        OnCGTaskCreate = new Receive()
        {
            OperationName = "OnCGTaskCreate",
            ServiceContractName = System.Xml.Linq.XName.Get("{Service.Workflow}IWorkflowService"),
            Action = "Service.Workflow/IWorkflowService/OnCGTaskCreate",
            DisplayName = "OnCGAccountCreate_Receive",
            CanCreateInstance = false,
            Content = new ReceiveParametersContent
            {
                Parameters =
                {
                    { "Context", new OutArgument<WorkflowExecutionContext>() },
                    { "Entity", new OutArgument<CGTask>() }
                }
            },
        };
    }

    protected override void CacheMetadata(NativeActivityMetadata metadata)
    {
        metadata.AddImplementationChild(OnCGTaskCreate);
        HandleVariable = new Variable<CorrelationHandle>("correlationHandle");
        OnCGTaskCreate.CorrelatesWith = new InArgument<CorrelationHandle>(HandleVariable);
        metadata.AddImplementationVariable(HandleVariable);
        base.CacheMetadata(metadata);
    }

    protected override void Execute(NativeActivityContext context)
    {
        var handle = Handle.Get(context);
        HandleVariable.Set(context, handle);
        OnCGTaskCreate.CorrelatesOn = new System.ServiceModel.MessageQuerySet() { { "key1", new XPathMessageQuery("sm:body()/xgSc:OnCGTaskCreate/xgSc:Context/xg0:WorkflowId") } };
        OnCGTaskCreate.ServiceContractName = ServiceContractName.Get(context);

        context.ScheduleActivity(OnCGTaskCreate, new CompletionCallback(OnCallCompleted));
    }

    private void OnCallCompleted(NativeActivityContext context, ActivityInstance instance)
    {
      //figure this part out later
    }
}
此外,因为我只在设计器中使用过
Receive
活动,所以我不确定是否在代码中正确实现了它

下面是Receive活动的样例XAML代码,以及它在设计器中的使用方式:

                        <p:Receive Action="Service.Workflow/IWorkflowService/OnCGTaskCreate" DisplayName="OnCGTaskCreate_Receive" sap2010:WorkflowViewState.IdRef="Receive_1" OperationName="OnCGTaskCreate" ProtectionLevel="None" ServiceContractName="p1:IWorkflowService">
                          <p:Receive.CorrelatesOn>
                            <p:XPathMessageQuery x:Key="key1">
                              <p:XPathMessageQuery.Namespaces>
                                <ssx:XPathMessageContextMarkup>
                                  <x:String x:Key="xg0">http://schemas.datacontract.org/2004/07/Service.Base</x:String>
                                  <x:String x:Key="xgSc">Service.Workflow</x:String>
                                </ssx:XPathMessageContextMarkup>
                              </p:XPathMessageQuery.Namespaces>sm:body()/xgSc:OnCGTaskCreate/xgSc:Context/xg0:WorkflowId</p:XPathMessageQuery>
                          </p:Receive.CorrelatesOn>
                          <p:Receive.CorrelatesWith>
                            <InArgument x:TypeArguments="p:CorrelationHandle">
                              <mca:CSharpValue x:TypeArguments="p:CorrelationHandle">handle</mca:CSharpValue>
                            </InArgument>
                          </p:Receive.CorrelatesWith>
                          <p:ReceiveParametersContent>
                            <OutArgument x:TypeArguments="acgsb:WorkflowExecutionContext" x:Key="Context" />
                            <OutArgument x:TypeArguments="acgsbc:CGTask" x:Key="Entity">
                              <mca:CSharpReference x:TypeArguments="acgsbc:CGTask">task</mca:CSharpReference>
                            </OutArgument>
                          </p:ReceiveParametersContent>
                        </p:Receive>

http://schemas.datacontract.org/2004/07/Service.Base
服务.工作流
sm:body()/xgSc:OnCGTaskCreate/xgSc:Context/xg0:WorkflowId
手柄
任务
总之,我该如何通过在
NativeActivity
中编程调度来运行上述XAML代码,以简化其使用

编辑:

我之所以使用
变量
,完全是因为博客文章描述了如何安排内部活动


遗憾的是,这篇文章是关于调度除
Receive
活动之外的其他活动的,所以它可能不适用于我的问题。

不一定是您的问题,但对于初学者来说,在构造函数上进行初始化(内部活动、变量和参数),而不是在
CacheMetadata
CacheMatadata
被设计器和工作流运行时多次调用,并不打算这样使用。@Jota非常正确。上面的代码是解决其他问题的多次尝试的结果,我忘记了(重新)移动它。因此,您通过
AddImplementationVariable()
添加的变量与您设置的值不同。该活动只能处理拥有的变量,而您的活动在到达执行方法时不知道
HandleVariable
。此外,我可能遗漏了一些内容,为什么需要
HandleVariable
?为什么不使用
Handle
@Jota初始化
OnCGTaskCreate.CorrelatesWith
请注意我对这个问题所做的编辑。请注意,我在
CacheMetadata
和构造函数中都尝试过启动
变量
,结果是相同的。我还尝试将
OnCGTaskCreate.CorrelatesWith
Handle
(根据您的建议)设置为
OnCGTaskCreate.CorrelatesWith(根据您的建议),虽然我没有得到任何异常,但最终的结果是工作流没有对事件做出反应,因此我继续尝试其他内容。当然,如果我只使用从“导入服务合同”选项创建的
Receive
活动,它确实可以工作,但这不是我想要实现的。
                        <p:Receive Action="Service.Workflow/IWorkflowService/OnCGTaskCreate" DisplayName="OnCGTaskCreate_Receive" sap2010:WorkflowViewState.IdRef="Receive_1" OperationName="OnCGTaskCreate" ProtectionLevel="None" ServiceContractName="p1:IWorkflowService">
                          <p:Receive.CorrelatesOn>
                            <p:XPathMessageQuery x:Key="key1">
                              <p:XPathMessageQuery.Namespaces>
                                <ssx:XPathMessageContextMarkup>
                                  <x:String x:Key="xg0">http://schemas.datacontract.org/2004/07/Service.Base</x:String>
                                  <x:String x:Key="xgSc">Service.Workflow</x:String>
                                </ssx:XPathMessageContextMarkup>
                              </p:XPathMessageQuery.Namespaces>sm:body()/xgSc:OnCGTaskCreate/xgSc:Context/xg0:WorkflowId</p:XPathMessageQuery>
                          </p:Receive.CorrelatesOn>
                          <p:Receive.CorrelatesWith>
                            <InArgument x:TypeArguments="p:CorrelationHandle">
                              <mca:CSharpValue x:TypeArguments="p:CorrelationHandle">handle</mca:CSharpValue>
                            </InArgument>
                          </p:Receive.CorrelatesWith>
                          <p:ReceiveParametersContent>
                            <OutArgument x:TypeArguments="acgsb:WorkflowExecutionContext" x:Key="Context" />
                            <OutArgument x:TypeArguments="acgsbc:CGTask" x:Key="Entity">
                              <mca:CSharpReference x:TypeArguments="acgsbc:CGTask">task</mca:CSharpReference>
                            </OutArgument>
                          </p:ReceiveParametersContent>
                        </p:Receive>