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>