2012-02-15 64 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

相關問題