Initializing a WF program using InArguments
In this task, we will create a WF program that accepts arguments when initialized in the WF host. In WF4, we can use InArguments
to define the way data flows into an activity.
How to do it...
Create a workflow project:
Create a new Workflow Console Application under the
Chapter01
solution. Name the projectUseInArgument
.Author the WF program:
Create a workflow as shown in the following screenshot:
Write code to host the workflow.
Open the
Program.cs
file and change the host code as follows:using System.Activities; using System.Activities.Statements; namespace UseInArgument { class Program { static void Main(string[] args) { WorkflowInvoker.Invoke(new Workflow1() { FirstName="Andrew", SecondName="Zhu" }); } } }
Run it:
Set
UseInArgument
as StartUp project. Press Ctrl+F5 to build and run the workflow without debugging. The application should run in a console window and print the following message:
How it works...
Consider the following statement from the code we saw in the preceding section:
FirstName="Andrew"
FirstName
is an InArgument
type, but how can we assign a string to InArgument
without any explicit cast? This is because InArgument
is declared with an attribute System.ComponentModel.TypeConverterAttribute(System.Activities.XamlIntegration.InArgumentConverter)
. The class inheritance is shown in the following diagram:
It is the InArgumentConverter
that makes assigning a string to an InArgument
possible. If we want to know more about TypeConverter
, we can check MSDN the reference at http://msdn.microsoft.com/en-us/library/system.componentmodel.typeconverter.aspx
There's more
In WF3/3.5, we can pass values to Workflow wrapped in a Dictionary<T>
object. This also applies to WF4.
using System.Activities; using System.Activities.Statements; using System.Collections.Generic; namespace UseInArgument { class Program { static void Main(string[] args) { IDictionary<string, object> inputDictionary = new Dictionary<string, object>() { {"FirstName","Andrew"}, {"SecondName","Zhu"} }; WorkflowInvoker.Invoke(new Workflow1(), inputDictionary); } } }
If we are creating workflows using imperative code, we can use InArgument
in the following way:
public class WorkflowInCode:Activity { public InArgument<string> FirstName { get; set; } public InArgument<string> SecondName { get; set; } public WorkflowInCode() { this.Implementation = () => new Sequence() { Activities = { new WriteLine(){ Text=new InArgument<string>( activityContext=>"My name is "+FirstName.Get(activityContext) ) }, new WriteLine(){ Text=new InArgument<string>( ActivityContext=>SecondName.Get(ActivityContext) ) } } }; } }