2012-02-15 126 views
1

比方说,我有progrmatically创建这样我知道执行它是第一序列化对象ActivityBuilderXAML如何在不序列化的情况下执行ActivityBuilder?

ActivityBuilder<int> ab = new ActivityBuilder<int>(); 
ab.Name = "Add"; 
ab.Properties.Add(new DynamicActivityProperty {Name = "Operand1", Type = typeof (InArgument<int>)}); 
ab.Properties.Add(new DynamicActivityProperty {Name = "Operand2", Type = typeof (InArgument<int>)}); 
ab.Implementation = new Sequence 
     { 
      Activities = 
       { 
        new WriteLine 
         { 
          Text = 
           new VisualBasicValue<string>(
           "Operand1.ToString() + \" + \" + Operand2.ToString()") 
         } 

       } 
     }; 

一种方式的工作流。接下来,使用ActivityXamlServices加载序列化的XAML。为参数创建一个字典。使用WorkflowInvokerWorkflowApplication

执行它是否有任何方法来执行此工作流而无需将活动构建器转换/序列化为XAML?

WorkflowApplication和WorkflowInvoker将一个Activity作为输入执行。我能以某种方式直接使用activityBuilder.ImplementationWorkflowApplicationWorkflowInvoker

为什么我要这个?因为我们有用户用来创建和执行工作流的工作流设计器。用户还可以编程创建工作流程。工作流可以达到80MB大小。由于将80MB文件序列化并从XAML进行反序列化,这会损害应用程序的内存。我想以某种方式跳过这一步并直接执行活动。

它有道理吗?

+0

默认情况下VS设计者使用ActivityBuilder。我想你是在重新托管版本;我从来没有尝试过,但不能强迫它使用DynamicActivity而不是ActivityBuilder?只需将一个空的DynamicActivity序列化为Designer.Text。 – Joao 2012-02-15 11:40:10

+0

那么,在运行时执行它的另一种方法是将ActivityBuilder转换为DynamicActivity。这只是几行代码,然后您可以像执行WorklowInvoker/WorkflowApplication一样执行DynamicActivity – Joao 2012-02-15 11:43:15

+0

您可以指出我要编写哪些代码吗?我无法找到它 – 2012-02-15 11:56:01

回答

4

不需要使用ActivityBuilder,只需创建您想要的活动并执行它们即可。

var wf = new Sequence() 
{ 
    Variables = 
    { 
     new Variable<int>("Operand1", 7), 
     new Variable<int>("Operand2", 42) 
    }, 
    Activities = 
    { 
     new WriteLine 
     { 
      Text = 
       new VisualBasicValue<string>(
       "Operand1 & \" + \" & Operand2") 
     } 
    } 
}; 


WorkflowInvoker.Invoke(wf); 

使用DynamicActivityProperty一个例子:

var wf = new DynamicActivity<int> 
    { 
     Properties = 
     { 
      new DynamicActivityProperty { Name = "Operand1", Type = typeof(InArgument<int>) }, 
      new DynamicActivityProperty { Name = "Operand2", Type = typeof(InArgument<int>) } 
     }, 
     Implementation =() => new Sequence() 
      { 
       Activities = 
       { 
        new WriteLine 
        { 
         Text = 
          new VisualBasicValue<string>(
          "Operand1 & \" + \" & Operand2") 
        }, 
        new Assign<int> 
        { 
         To = new ArgumentReference<int> { ArgumentName = "Result" }, 
         Value = new VisualBasicValue<int>("Operand1 + Operand2") 
        } 
       } 
      } 
    }; 

    var inputs = new Dictionary<string, object>(); 
    inputs["Operand1"] = 7; 
    inputs["Operand2"] = 42; 
    var output = WorkflowInvoker.Invoke(wf, inputs); 
    Console.WriteLine(output); 
+0

我的场景有点复杂。我无法改变现有的实施。我需要这些动态属性,因为它们在更大的图像中是必需的。变量的范围将仅在序列 – 2012-02-15 11:54:51

+0

内部没有问题,请参阅更新答案中的第二个示例。 – Maurice 2012-02-15 12:02:05

+0

谢谢aloooooot – 2012-02-15 15:19:41

相关问题