2017-10-11 15 views
0

저는 WWF (Windows Workflow Foundation)를 사용하고 있습니다. 변수를 정의한 하나의 시퀀스로 Activity (XAML)를 만들었습니다.Windows 워크 플로 : WorkflowApplication에서 변수 가져 오기

WorkflowApplication 인스턴스를 생성하여 콘솔 응용 프로그램에서 활동을 실행합니다. 내 콘솔 응용 프로그램에서 변수 값을 얻으려면 어떻게해야합니까?

XML에서 WorkflowApplication의 인스턴스를 유지하고 그 안에 변수와 그 값을 보았습니다. XML에서 변수의 값을 가져 오는 올바른 방법이 있습니까?

+0

변수의 범위는 활동으로 지정됩니다. 인수를 사용하여 콘솔 응용 프로그램에서 값을 가져와야합니다. –

+0

WorkflowApplication 인스턴스에는 InArgument 을 포함하는 WorkflowDefinition 속성이 있습니다. InArgument에 의해 값을 얻으려면 context.GetValue()를 호출해야합니다. WorkflowApplication을 사용하는 콘솔 응용 프로그램에서 컨텍스트를 얻으려면 어떻게해야합니까? – Porfus

+0

당신이 필요하지 않습니다, 내 대답을 참조 –

답변

1

따라서 마지막 워크샵이 완료되기 전에 콘솔 응용 프로그램에서 상태를 가져오고 싶다고 말한 것입니다. 안타깝게도 In/Out 및 Out 인수는 워크 플로 완료시에만 사용할 수 있습니다. 그러나 워크 플로 변수 및 인수 이외의 다른 구문을 사용하여 호스트 프로세스와 통신하는 방법이 있습니다.

이렇게하는 방법 중 하나는 호스트 프로세스와 상호 작용하는 데 사용할 수있는 사용자 지정 확장 프로그램을 사용하는 것입니다. 확장은 모든 유형이 될 수 있으며 워크 플로우 및 호스트 프로세스에서 사용할 수 있습니다. 전체 예제 :

using System; 
using System.Activities; 

namespace WorkflowDemo 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var app = new WorkflowApplication(new MyCustomActivity()); 
      var myExtension = new MyCommunicationExtension(); 
      myExtension.MyValueChanged += (s, e) => Console.WriteLine(myExtension.MyValue); 

      app.Extensions.Add(myExtension); 
      app.Run(); 

      Console.ReadKey(); 
     } 
    } 

    public class MyCommunicationExtension 
    { 
     public string MyValue { get; private set; } 

     public event EventHandler<EventArgs> MyValueChanged; 

     public void OnMyValueChanged(string value) 
     { 
      MyValue = value; 
      MyValueChanged?.Invoke(this, EventArgs.Empty); 
     } 
    } 

    public class MyCustomActivity : CodeActivity 
    { 
     protected override void Execute(CodeActivityContext context) 
     { 
      var extensionObj = context.GetExtension<MyCommunicationExtension>(); 
      if (extensionObj != null) 
      { 
       extensionObj.OnMyValueChanged("Hello World"); 
      } 
     } 
    } 
} 
+0

당신의 방식은 북마크가 사용되지 않으면 작동합니다. 완료되기 전에 콘솔 응용 프로그램에서 Activity 상태를 내부적으로 찾아야합니다. – Porfus

+0

@ 포르 푸스 내 개정 된 답변보기. –