実行時における DynamicActivity を使用したアクティビティの作成

DynamicActivity は、パブリック コンストラクターを持つ、具体的なシール クラスです。 DynamicActivity は、実行時にアクティビティ DOM を使用してアクティビティの機能を組み立てるために使用できます。

DynamicActivity の機能

DynamicActivity は、実行プロパティ、引数、変数にアクセスできますが、子アクティビティのスケジュール設定や追跡などのランタイム サービスにはアクセスできません。

最上位のプロパティは、ワークフローの Argument オブジェクトを使用して設定できます。 命令型コードでは、これらの引数は新しい型で CLR プロパティを使用して作成されます。 XAML では x:Class タグおよび x:Member タグを使用して、これらの引数が宣言されます。

DynamicActivity を使用して構築されたアクティビティは、ICustomTypeDescriptor を使用してデザイナーとやり取りします。 デザイナーで作成されたアクティビティは、次の手順に示すように、Load を使用して動的に読み込むことができます。

命令型コードを使用して実行時にアクティビティを作成する

  1. Visual Studio 2010 を開きます。

  2. [ファイル][新規作成][プロジェクト] の順に選択します。 [プロジェクトの種類] ウィンドウの [Visual C#] の下にある [ワークフロー 4.0] を選択し、 [v2010] ノードを選択します。 [テンプレート] ウィンドウで [シーケンシャル ワークフロー コンソール アプリケーション] をクリックします。 新しいプロジェクトに DynamicActivitySample という名前を付けます。

  3. HelloActivity プロジェクトの Workflow1.xaml を右クリックして、 [削除] をクリックします。

  4. Program.cs を開きます。 次のディレクティブをファイルの先頭に追加します。

    using System.Collections.Generic;  
    
  5. 1 つの Main アクティビティを含む Sequence アクティビティを作成する次のコードで WriteLine メソッドの内容を置き換え、新しい動的アクティビティの Implementation プロパティに割り当てます。

    //Define the input argument for the activity  
    var textOut = new InArgument<string>();  
    //Create the activity, property, and implementation  
                Activity dynamicWorkflow = new DynamicActivity()  
                {  
                    Properties =
                    {  
                        new DynamicActivityProperty  
                        {  
                            Name = "Text",  
                            Type = typeof(InArgument<String>),  
                            Value = textOut  
                        }  
                    },  
                    Implementation = () => new Sequence()  
                    {  
                        Activities =
                        {  
                            new WriteLine()  
                            {  
                                Text = new InArgument<string>(env => textOut.Get(env))  
                            }  
                        }  
                    }  
                };  
    //Execute the activity with a parameter dictionary  
                WorkflowInvoker.Invoke(dynamicWorkflow, new Dictionary<string, object> { { "Text", "Hello World!" } });  
                Console.ReadLine();  
    
  6. アプリケーションを実行します。 "Hello World!" というテキストを含むコンソール ウィンドウが表示されます。

XAML を使用して実行時にアクティビティを作成する

  1. Visual Studio 2010 を開きます。

  2. [ファイル][新規作成][プロジェクト] の順に選択します。 [プロジェクトの種類] ウィンドウの [Visual C#] の下にある [ワークフロー 4.0] を選択し、 [v2010] ノードを選択します。 [テンプレート] ウィンドウで [ワークフロー コンソール アプリケーション] を選択します。 新しいプロジェクトに DynamicActivitySample という名前を付けます。

  3. HelloActivity プロジェクトの Workflow1.xaml を開きます。 デザイナーの下部にある [引数] オプションをクリックします。 String 型の TextToWrite という新しい In 引数を作成します。

  4. WriteLine アクティビティをツールボックスの [プリミティブ] セクションからデザイナー サーフェイスにドラッグします。 値 TextToWrite をそのアクティビティの Text プロパティに割り当てます。

  5. Program.cs を開きます。 次のディレクティブをファイルの先頭に追加します。

    using System.Activities.XamlIntegration;  
    
  6. Main メソッドの内容を次のコードに置き換えます。

    Activity act2 = ActivityXamlServices.Load(@"Workflow1.xaml");  
                    results = WorkflowInvoker.Invoke(act2, new Dictionary<string, object> { { "TextToWrite", "HelloWorld!" } });  
    Console.ReadLine();  
    
  7. アプリケーションを実行します。 "Hello World!" というテキストを含むコンソール ウィンドウが表示されます。

  8. ソリューション エクスプローラーで、Workflow1.xaml ファイルを右クリックして、 [コードの表示] をクリックします。 アクティビティ クラスが x:Class を使用して作成され、プロパティが x:Property を使用して作成されています。

関連項目