axl*_*l g 5 .net workflow-foundation-4
我正在尝试为承载子活动的WF4创建一个自定义活动,并将一些参数传递给它的子活动.我在下面附上我的活动的简化版本(父母和孩子)
public class Child : CodeActivity
{
public InArgument<Dictionary<string, object>> Data;
protected override void Execute(CodeActivityContext context)
{
Dictionary<string, object> data = Data.Get(context);
//Some operations on the input data
}
}
public class Parent : NativeActivity
{
public InArgument<int> Value1 { get; set; }
public InArgument<string> Value2 { get; set; }
public Child Body { get; set; }
protected override void Execute(NativeActivityContext context)
{
int value1 = Value1.Get(context);
string value2 = Value2.Get(context);
Dictionary<string, object> data = new Dictionary<string, object>();
data.Add("value1", value1);
data.Add("value2", value2);
context.SetValue(Body.Data, data);
context.ScheduleActivity(this.Body);
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
Body = new Child();
base.CacheMetadata(metadata);
}
}
Run Code Online (Sandbox Code Playgroud)
当工作流程执行到达活动的Execute方法时,Child活动中的Data参数为null.
有人可以,请给我一些指示如何在这两个活动之间传递论据?
虽然使用额外变量的方法起作用,但使用ActivityAcytion或者如果您还想要一个带有ActivityFunc的结果,则使用某些输入调度子项的"官方"方式.
我担心代码不会变得更简单或更容易理解,但为了完整起见,我只是决定添加它.
public class Child : CodeActivity<object>
{
public InArgument<Dictionary<string, object>> Data { get; set; }
protected override object Execute(CodeActivityContext context)
{
Dictionary<string, object> data = Data.Get(context);
foreach (var item in data)
{
Console.WriteLine(item);
}
return "Some result";
}
}
public class Parent : NativeActivity<object>
{
public InArgument<int> Value1 { get; set; }
public InArgument<string> Value2 { get; set; }
public ActivityFunc<Dictionary<string, object>, object> Body { get; set; }
protected override void Execute(NativeActivityContext context)
{
int value1 = Value1.Get(context);
string value2 = Value2.Get(context);
Dictionary<string, object> data = new Dictionary<string, object>();
data.Add("value1", value1);
data.Add("value2", value2);
context.ScheduleFunc<Dictionary<string, object>, object>(Body, data, ChildCompletionCallback);
}
protected override void CacheMetadata(NativeActivityMetadata metadata)
{
var arg = new DelegateInArgument<Dictionary<string, object>>();
Body = new ActivityFunc<Dictionary<string, object>, object>
{
Argument = arg,
Handler = new Child() { Data = arg }
};
base.CacheMetadata(metadata);
}
private void ChildCompletionCallback(NativeActivityContext context, ActivityInstance completedInstance, object result)
{
//Set the output for the parent activity at the completion of the child activity
this.Result.Set(context, result);
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |