2015-10-27 109 views
1

我们希望制作由最终用户设计的工作流程。 我能够在数据库中存储一些工作流定义,重新加载它们并使它们在服务中工作。如何将非字符串参数传递给内部活动?

为了使用户能够创建工作流程,我们需要创建自己的活动。我想将非简单的参数(即列表,列表)传递给内部活动。我阅读了很多关于传递参数的文章,但是我找不到适合我需求的文章,所有文章都只展示了如何将参数传递给主工作流活动(在WorkflowInvoker.Invoke方法中使用Dictionary)。

我们有一个CodeActivity Activity1库,其参数为Arg1(List)。 最终用户将使用此库创建一个新的活动(例如一个序列)。

Activity1 act1 = new Activity1(); 
act1.Arg1 = new InArgument<List<string>>(new List<string> { "a", "b", "c" }); 

Sequence seq = new Sequence 
{ 
    Activities = { act1 }; 
} 

// Now serialize end user workflow 
Stream newStream = ...; 
XamlWriter l_xamlWriter = ActivityXamlServices.CreateBuilderWriter(new XamlXmlWriter(newStream, new XamlSchemaContext())); 

XamlServices.Save(l_xamlWriter, seq); 

如何初始化列表的参数? (前面的代码以'Literal'失败:Literal仅支持值类型和不可变类型System.String)。

有没有办法将这些参数传递给内部活动或将这些参数以编程方式转换为VisualBasicValue或CSharpValue以允许序列化工作流定义?我们不想在每次运行工作流程时设置这些参数,我们希望将该值存储在定义中。

任何帮助:-)

回答

0

我发现的唯一办法理解是顺序包装成一个DynamicActivity和参数传递给WorkflowApplication(或WorkflowInvoker):这么多

Activity1 act1 = new Activity1(); 
act1.Arg1 = new InArgument<Collection<string>>(new VisualBasicValue<Collection<string>>("MyVals")); 

Sequence seq = new Sequence 
{ 
    Activities = { act1 }; 
} 

DynamicActivity da = new DynamicActivity() 
{ 
    Name = "test", 
    Implementation =() => seq, 
    Properties = 
      { 
       new DynamicActivityProperty() 
       { 
        Name = "MyVals", 
        Type = typeof(InArgument<Collection<string>>), 
        Value = null 
       }, 
      } 
}; 



WorkflowInvoker.Invoke(da, new Dictionary<string, object> { { "MyVals", new Collection<string>{ "a", "b", "c" } } }); 

代码只是为了通过一个清单...

相关问题