명령 코드를 사용하여 워크플로 제작
이 항목은 Windows Workflow Foundation 4에 적용됩니다.
워크플로 정의는 구성된 활동 개체의 트리입니다. XAML을 수동으로 편집하거나 Workflow Designer를 사용하여 XAML을 생성하는 등 여러 가지 방법으로 이 활동 트리를 정의할 수 있습니다. 하지만 XAML 사용은 필수 사항이 아닙니다. 프로그래밍 방식으로 워크플로 정의를 만들 수도 있습니다. 이 항목에서는 코드를 사용하여 워크플로 정의를 만드는 방법을 대략적으로 설명합니다.
워크플로 정의 만들기
활동 형식의 인스턴스를 인스턴스화하고 활동 개체의 속성을 구성하여 워크플로 정의를 만들 수 있습니다. 자식 활동을 포함하지 않는 활동의 경우 코드 몇 행으로 이 작업을 완료할 수 있습니다.
Activity wf = new WriteLine
{
Text = "Hello World."
};
WorkflowInvoker.Invoke(wf);
![]() |
---|
이 항목의 예에서는 WorkflowInvoker를 사용하여 샘플 워크플로를 실행합니다. 워크플로 호출, 인수 전달 및 사용 가능한 다양한 호스팅 선택 사항에 대한 자세한 내용은 WorkflowInvoker 및 WorkflowApplication 사용을 참조하십시오. |
이 예제에서는 WriteLine 활동 하나로 구성된 워크플로를 만듭니다. WriteLine 활동의 Text 인수를 설정하고 워크플로를 호출합니다. 활동이 자식 활동을 포함하는 경우 생성 메서드는 유사합니다. 다음 예에서는 WriteLine 활동 두 개를 포함하는 Sequence 활동을 사용합니다.
Activity wf = new Sequence
{
Activities =
{
new WriteLine
{
Text = "Hello"
},
new WriteLine
{
Text = "World."
}
}
};
WorkflowInvoker.Invoke(wf);
개체 이니셜라이저 사용
이 항목의 예에서는 개체 초기화 구문을 사용합니다. 개체 초기화 구문은 워크플로에 있는 활동의 계층적 뷰를 제공하고 활동 간의 관계를 표시하기 때문에 코드에서 워크플로 정의를 만드는 유용한 방법일 수 있습니다. 프로그래밍 방식으로 워크플로를 만들 때 개체 초기화 구문을 사용하기 위한 요구 사항은 없습니다. 다음 예는 이전 예와 기능적으로 동일합니다.
WriteLine hello = new WriteLine();
hello.Text = "Hello";
WriteLine world = new WriteLine();
world.Text = "World";
Sequence wf = new Sequence();
wf.Activities.Add(hello);
wf.Activities.Add(world);
WorkflowInvoker.Invoke(wf);
개체 이니셜라이저에 대한 자세한 내용은 방법: 생성자를 호출하지 않고 개체 초기화(C# 프로그래밍 가이드) 및 방법: 개체 이니셜라이저를 사용하여 개체 선언을 참조하십시오.
변수, 리터럴 값 및 식 작업
코드를 사용하여 워크플로 정의를 만들 때는 워크플로 정의 만들기 중 실행되는 코드와 해당 워크플로의 인스턴스 실행 중 실행되는 코드를 알아야 합니다. 예를 들어, 다음은 난수를 생성하여 콘솔에 쓰기 위한 워크플로입니다.
Variable<int> n = new Variable<int>
{
Name = "n"
};
Activity wf = new Sequence
{
Variables = { n },
Activities =
{
new Assign<int>
{
To = n,
Value = new Random().Next(1, 101)
},
new WriteLine
{
Text = new InArgument<string>((env) => "The number is " + n.Get(env))
}
}
};
이 워크플로 정의 코드를 실행하면 Random.Next
가 호출되고 결과가 워크플로 정의에 리터럴 값으로 저장됩니다. 이 워크플로의 많은 인스턴스를 호출할 수 있으며 모두 동일한 수를 표시합니다. 워크플로 실행 중 난수가 생성되도록 하려면 워크플로를 실행할 때마다 계산되는 식을 사용해야 합니다.
new Assign<int>
{
To = n,
Value = new VisualBasicValue<int>("New Random().Next(1, 101)")
}
VisualBasicValue은 식에서 r 값으로 사용할 수 있는 Visual Basic 구문의 식을 나타내며, 이 식을 포함하는 활동이 실행될 때마다 계산됩니다. 식의 결과는 워크플로 변수 n
에 할당되고 이 결과는 워크플로의 다음 활동에서 사용됩니다. 런타임에 워크플로 변수 n
에 액세스하려면 ActivityContext가 필요합니다. 다음 람다 식을 사용하여 이 변수에 액세스할 수 있습니다.
new WriteLine
{
Text = new InArgument<string>((env) => "The number is " + n.Get(env))
}
람다 식은 XAML 형식으로 serialize할 수 없습니다. 이 식을 XAML과 호환 가능하게 만들려면 다음 예와 같이 ExpressionServices와 Convert을 사용합니다.
new WriteLine
{
//Text = new InArgument<string>((env) => "The number is " + n.Get(env))
Text = ExpressionServices.Convert((env) => "The number is " + n.Get(env))
}
VisualBasicValue을 사용할 수도 있습니다.
new WriteLine
{
//Text = new InArgument<string>((env) => "The number is " + n.Get(env))
//Text = ExpressionServices.Convert((env) => "The number is " + n.Get(env))
Text = new VisualBasicValue<string>("\"The number is \" + n.ToString()")
}
식에 대한 자세한 내용은 식를 참조하십시오.
인수 및 동적 활동
워크플로 정의는 코드에서 활동을 활동 트리로 어셈블하고 속성과 인수를 구성하여 만들어집니다. 기존 인수를 바인딩할 수 있지만, 새 인수를 활동에 추가할 수는 없습니다. 여기에는 루트 활동에 전달된 워크플로 인수가 포함됩니다. 명령적 코드에서는 워크플로 인수가 새 CLR 형식에 대한 속성으로 지정되고 XAML에서는 x:Class 및 x:Member를 사용하여 선언됩니다. 메모리 내 개체 트리로 워크플로 정의를 만들 때 새 CLR 형식이 만들어지지 않았기 때문에 인수를 추가할 수 없습니다. 하지만 DynamicActivity에 인수를 추가할 수 있습니다. 이 예제에서는 정수 인수 두 개를 취하여 이를 더한 다음 그 결과를 반환하는 DynamicActivity을 만듭니다. 각 인수에 대해 DynamicActivityProperty를 만들고, 작업 결과를 DynamicActivity의 Result 인수에 할당합니다.
InArgument<int> Operand1 = new InArgument<int>();
InArgument<int> Operand2 = new InArgument<int>();
DynamicActivity<int> wf = new DynamicActivity<int>
{
Properties =
{
new DynamicActivityProperty
{
Name = "Operand1",
Type = typeof(InArgument<int>),
Value = Operand1
},
new DynamicActivityProperty
{
Name = "Operand2",
Type = typeof(InArgument<int>),
Value = Operand2
}
},
Implementation = () => new Sequence
{
Activities =
{
new Assign<int>
{
To = new ArgumentReference<int> { ArgumentName = "Result" },
Value = new InArgument<int>((env) => Operand1.Get(env) + Operand2.Get(env))
}
}
}
};
Dictionary<string, object> wfParams = new Dictionary<string, object>
{
{ "Operand1", 25 },
{ "Operand2", 15 }
};
int result = WorkflowInvoker.Invoke(wf, wfParams);
Console.WriteLine(result);
동적 활동에 대한 자세한 내용은 동적 활동을 사용하여 런타임에 활동 만들기를 참조하십시오.