2012-02-15 3 views
1

의이 내가 처음 XAMLActivityBuilder 객체를 직렬화하는 것입니다 실행 알이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()") 
         } 

       } 
     }; 

하나의 방법처럼 progrmatically 만든 워크 플로우 있다고 가정 해 봅시다. 그런 다음 ActivityXamlServices을 사용하여 직렬화 된 XAML을로드하십시오. 매개 변수에 대한 사전을 만듭니다. WorkflowInvoker 또는 WorkflowApplication

작업 작성자를 XAML로 변환/serialize 할 필요없이이 워크 플로를 실행할 수있는 방법이 있습니까?

WorkflowApplication 및 WorkflowInvoker는 활동을 입력으로 사용하여 실행합니다. 어떻게 든 activityBuilder.ImplementationWorkflowApplication 또는 WorkflowInvoker과 직접 사용할 수 있습니까?

왜 내가 이것을 원하니? 우리는 사용자가 워크 플로를 만들고 실행하는 데 사용하는 워크 플로 디자이너가 있기 때문입니다. 또한 사용자는 프로그래밍 방식으로 워크 플로를 만듭니다. 워크 플로 크기는 최대 80MB까지 가능합니다. 이것은 XAML 사이의 80MB 파일의 직렬화 및 비 직렬화로 인해 응용 프로그램의 메모리를 손상시킵니다. 어떻게 든이 단계를 건너 뛰고 직접 활동을 실행하고 싶습니다.

의미가 있습니까?

+0

는 ActivityBuilder를 사용합니다. 나는 당신이 rehosted 버전을 ysing하고 있다고 생각한다; 나는 그것을 시도한 적이 없지만 ActivityBuilder 대신 DynamicActivity를 사용하도록 강제 할 수는 없습니까? 빈 DynamicActivity를 Designer.Text에 직렬화하면됩니다. – Joao

+0

런타임에 ActivityBuilder를 DynamicActivity로 변환하는 또 다른 방법이 있습니다. 단지 몇 줄의 코드 일 뿐이므로 WorkflowInvoker/WorkflowApplication에서 일반적으로하는 것처럼 DynamicActivity를 실행할 수 있습니다. – Joao

+0

어떤 코드를 가리키게 할 수 있습니까? 찾을 수 없습니다. –

답변

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를 사용하는 예를

는 : 디자이너 VS 기본적으로

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

내 시나리오가 약간 복잡합니다. 기존 구현을 변경할 수 없습니다. 더 큰 그림에서 이러한 동적 속성이 필요하기 때문에 이러한 동적 속성이 필요합니다. 변수의 범위는 시퀀스 내부 일뿐입니다. –

+0

아무런 문제가 없습니다. 업데이트 된 답변의 두 번째 예를 참조하십시오. – Maurice

+0

감사합니다. aloooooot –

관련 문제