官术网_书友最值得收藏!

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...

  1. Create a workflow project:

    Create a new Workflow Console Application under the Chapter01 solution. Name the project UseInArgument .

  2. Author the WF program:

    Create a workflow as shown in the following screenshot:

    How to do it...
  3. 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"
                });
            }
        }
    }
  4. 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 to do it...

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:

How it works...

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)
                        )
                }
            }
        };
    }
}
主站蜘蛛池模板: 榆林市| 玉田县| 天津市| 武清区| 荃湾区| 武强县| 宜川县| 阳西县| 桂林市| 九江市| 汝阳县| 新巴尔虎右旗| 屏南县| 吉林市| 阿克苏市| 扶沟县| 曲阜市| 道真| 西平县| 潞西市| 鹤岗市| 韶关市| 三台县| 额济纳旗| 永德县| 黄骅市| 广汉市| 崇文区| 廉江市| 瓮安县| 萨嘎县| 宝山区| 咸宁市| 项城市| 文山县| 盐津县| 中方县| 贺州市| 阆中市| 江北区| 衡山县|