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...
using System.Activities;
using System.Activities.Statements;
namespace UseInArgument
{
class Program
static void Main(string[] args)
WorkflowInvoker.Invoke(new Workflow1()
FirstName = "Andrew",
SecondName = "Zhu"
});
}
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 attributeSystem.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 referenceat 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.Collections.Generic;
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)
)
},
ActivityContext=>SecondName.
Get(ActivityContext)