.NET Framework 4 ワークフローでの相互運用アクティビティの使用

このトピックの内容は、Windows Workflow Foundation 4 に該当します。

.NET Framework 3.0 または .NET Framework 3.5 を使用して作成したアクティビティは、Interop アクティビティを使うことにより .NET Framework 4 ワークフローで使用できます。ここでは、Interop アクティビティの概要について説明します。

Ee264174.note(ja-jp,VS.100).gif Visual Basic 注 :
Interop アクティビティをワークフロー デザイナー ツールボックスに表示するには、ワークフローのプロジェクトで [ターゲット フレームワーク][.NET Framework 4] に設定します。

.NET Framework 4 ワークフローでの相互運用アクティビティの使用

このトピックでは、DiscountCalculator アクティビティを含む .NET Framework 3.5 アクティビティ ライブラリを作成します。DiscountCalculator は、購入額に基づいて割引を計算し、PolicyActivity を含む SequenceActivity で構成されます。

Ee264174.note(ja-jp,VS.100).gif注 :
このトピックで作成する .NET Framework 3.5 アクティビティでは、PolicyActivity を使用してアクティビティのロジックを実装します。.NET Framework 4 ワークフローでルールを使用するためにカスタムの .NET Framework 3.5 アクティビティまたは Interop アクティビティを使用する必要はありません。Interop アクティビティを使用せずに .NET Framework 4 ワークフローでルールを使用する例については、.NET Framework 4 のポリシー アクティビティ のサンプルを参照してください。

.NET Framework 3.5 アクティビティ ライブラリ プロジェクトを作成するには

  1. Visual Studio 2010 を開き、[ファイル] メニューの [新規作成][プロジェクト] をクリックします。

  2. [インストールされたテンプレート] ペインの [その他のプロジェクトの種類] を展開し、[Visual Studio ソリューション] をクリックします。

  3. [Visual Studio ソリューション] リストで [空のソリューション] を選択します。[名前] ボックスに「PolicyInteropDemo」と入力し、[OK] をクリックします。

  4. ソリューション エクスプローラー[PolicyInteropDemo] を右クリックし、[追加][新しいプロジェクト] をクリックします。

    Ee264174.Tip(ja-jp,VS.100).gifヒント :
    ソリューション エクスプローラー ウィンドウが表示されない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします。

  5. [インストールされているテンプレート] リストで、[Visual C#][ワークフロー] を選択します。.NET Framework バージョンのドロップダウン リスト ボックスで [.NET Framework 3.5] を選択し、[テンプレート] リストで [ワークフロー アクティビティ ライブラリ] を選択します。

  6. [名前] ボックスに「PolicyActivityLibrary」と入力し、[OK] をクリックします。

  7. ソリューション エクスプローラーActivity1.cs を右クリックし、[削除] をクリックします。[OK] をクリックして確定します。

DiscountCalculator アクティビティを作成するには

  1. ソリューション エクスプローラー[PolicyActivityLibrary] を右クリックし、[追加][アクティビティ] をクリックします。

  2. [Visual C# アイテム] リストで [アクティビティ (コード分離付き)] を選択します。[名前] ボックスに「DiscountCalculator」と入力し、[OK] をクリックします。

  3. ソリューション エクスプローラーDiscountCalculator.xoml を右クリックし、[コードの表示] をクリックします。

  4. DiscountCalculator クラスに次の 3 つのプロパティを追加します。

    public partial class DiscountCalculator : SequenceActivity
    {
        public double Subtotal { get; set; }
        public double DiscountPercent { get; set; }
        public double Total { get; set; }
    }
    
  5. ソリューション エクスプローラーDiscountCalculator.xoml を右クリックし、[ビュー デザイナー] をクリックします。

  6. [ツールボックス][Windows Workflow v3.0] セクションの Policy アクティビティをドラッグして、DiscountCalculator アクティビティにドロップします。

    Ee264174.Tip(ja-jp,VS.100).gifヒント :
    [ツールボックス] ウィンドウが表示されていない場合は、[表示] メニューの [ツールボックス] をクリックします。

ルールを構成するには

  1. 新しく追加した Policy アクティビティが選択されていない場合は、クリックして選択します。

  2. [プロパティ] ウィンドウRuleSetReference プロパティをクリックして選択し、プロパティの右にある省略記号ボタンをクリックします。

    Ee264174.Tip(ja-jp,VS.100).gifヒント :
    [プロパティ] ウィンドウが表示されていない場合は、[表示] メニューの [プロパティ ウィンドウ] を選択します。

  3. [新規] をクリックします。

  4. [ルールの追加] をクリックします。

  5. [条件] ボックスに、次の式を入力します。

    this.Subtotal >= 50 && this.Subtotal < 100
    
  6. [THEN アクション] ボックスに、次の式を入力します。

    this.DiscountPercent = 0.075
    
  7. [ルールの追加] をクリックします。

  8. [条件] ボックスに、次の式を入力します。

    this.Subtotal >= 100
    
  9. [THEN アクション] ボックスに、次の式を入力します。

    this.DiscountPercent = 0.15
    
  10. [ルールの追加] をクリックします。

  11. [条件] ボックスに、次の式を入力します。

    this.DiscountPercent > 0
    
  12. [THEN アクション] ボックスに、次の式を入力します。

    this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
    
  13. [ELSE アクション] ボックスに、次の式を入力します。

    this.Total = this.Subtotal
    
  14. [OK] をクリックして、[ルール セット エディター] ダイアログ ボックスを閉じます。

  15. [名前] リストで新しく作成された RuleSet が選択されていることを確認し、[OK] をクリックします。

  16. F6 キーを押してソリューションをビルドします。

この手順で DiscountCalculator アクティビティに追加したルールを次のコード例に示します。

Rule1: IF this.Subtotal >= 50 && this.Subtotal < 100 
       THEN this.DiscountPercent = 0.075 

Rule2: IF this. Subtotal >= 100 
       THEN this.DiscountPercent = 0.15 

Rule3: IF this.DiscountPercent > 0 
       THEN this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent 
       ELSE this.Total = this.Subtotal

PolicyActivity を実行すると、これら 3 つのルールによって、DiscountCalculator アクティビティの SubtotalDiscountPercent、および Total の各プロパティ値が評価および変更され、目的の割引が計算されます。

DiscountCalculator アクティビティと相互運用アクティビティの使用

.NET Framework 4 ワークフロー内で DiscountCalculator アクティビティを使用するには、Interop アクティビティを使用します。ここでは、2 つのワークフローを作成します。1 つはコードを使用し、1 つはワークフロー デザイナーを使用します。また、Interop アクティビティと DiscountCalculator アクティビティを使用する方法について説明します。両方のワークフローに同じホスト アプリケーションを使用します。

ホスト アプリケーションを作成するには

  1. ソリューション エクスプローラー[PolicyInteropDemo] を右クリックし、[追加][新しいプロジェクト] をクリックします。

  2. .NET Framework バージョンのドロップダウン リスト ボックスで [.NET Framework 4] が選択されていることを確認し、[Visual C# アイテム] リストで [ワークフロー コンソール アプリケーション] を選択します。

  3. [名前] ボックスに「PolicyInteropHost」と入力し、[OK] をクリックします。

  4. ソリューション エクスプローラー[PolicyInteropHost] を右クリックし、[プロパティ] をクリックします。

  5. [ターゲット フレームワーク] ボックスで、[.NET Framework 4 Client Profile] の選択を [.NET Framework 4] に変更します。[はい] をクリックして確定します。

  6. ソリューション エクスプローラー[PolicyInteropHost] を右クリックし、[参照の追加] をクリックします。

  7. [プロジェクト] タブの [PolicyActivityLibrary] をクリックし、[OK] をクリックします。

  8. ソリューション エクスプローラー[PolicyInteropHost] を右クリックし、[参照の追加] をクリックします。

  9. [.NET] タブの [System.Workflow.Activities][System.Workflow.ComponentModel]、および [System.Workflow.Runtime] をクリックし、[OK] をクリックします。

  10. ソリューション エクスプローラー[PolicyInteropHost] を右クリックし、[スタートアップ プロジェクトに設定] をクリックします。

  11. F6 キーを押してソリューションをビルドします。

コードでの Interop アクティビティの使用

この例では、Interop アクティビティおよび DiscountCalculator アクティビティを含むコードを使用して、ワークフロー定義を作成します。このワークフローは、WorkflowInvoker を使用して呼び出され、ルールの評価結果は、WriteLine アクティビティを使用してコンソールに書き込まれます。

コードで Interop アクティビティを使用するには

  1. ソリューション エクスプローラーProgram.cs を右クリックし、[コードの表示] をクリックします。

  2. ファイルの先頭に次の using ステートメントを追加します。

    using PolicyActivityLibrary;
    
  3. Main メソッドの内容を削除し、次のコードに置き換えます。

    static void Main(string[] args)
    {
        CalculateDiscountUsingCodeWorkflow();
    }
    
  4. 次のコードを含む CalculateDiscountUsingCodeWorkflow と呼ばれる Program クラスで新しいメソッドを作成します。

    static void CalculateDiscountUsingCodeWorkflow()
    {
        Variable<double> Subtotal = new Variable<double>
        {
            Default = 75.99,
            Name = "Subtotal"
        };
    
        Variable<double> DiscountPercent = new Variable<double>
        {
            Name = "DiscountPercent"
        };
    
        Variable<double> Total = new Variable<double>
        {
            Name = "Total"
        };
    
        Activity wf = new Sequence
        {
            Variables = { Subtotal, DiscountPercent, Total },
            Activities = 
            {
                new Interop
                {
                    ActivityType = typeof(DiscountCalculator),
                    ActivityProperties = 
                    {
                        { "Subtotal", new InArgument<double>(Subtotal) },
                        { "DiscountPercentOut", new OutArgument<double>(DiscountPercent) },
                        { "TotalOut", new OutArgument<double>(Total) }
                    }
                },
                new WriteLine
                {
                    Text =  new InArgument<string>(env => 
                        string.Format("Subtotal: {0:C}, Discount {1}%, Total {2:C}", 
                        Subtotal.Get(env), DiscountPercent.Get(env) * 100, Total.Get(env)))
                }
            }
        };
    
        WorkflowInvoker.Invoke(wf);
    }
    
    Ee264174.note(ja-jp,VS.100).gif注 :
    DiscountCalculator アクティビティの SubtotalDiscountPercent、および Total の各プロパティは、Interop アクティビティの属性として表示され、Interop アクティビティの ActivityProperties コレクションのローカル ワークフロー変数にバインドされます。SubtotalIn 引数として追加されますが、これは Subtotal のデータ フローが Interop アクティビティに読み込まれるためです。また、DiscountPercent および TotalOut 引数として追加されますが、これはこれらのデータ フローが Interop アクティビティから出力されるためです。2 つの Out 引数は、Out 引数を表すことを示すために、DiscountPercentOut および TotalOut という名前で追加されます。DiscountCalculator タイプは、Interop アクティビティの ActivityType として指定されます。

  5. Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドし、実行します。Subtotal 値を異なる値に置き換え、DiscountCalculator アクティビティに用意されているさまざまな割引レベルをテストします。

    Variable<double> Subtotal = new Variable<double>
    {
        Default = 75.99, // Change this value.
        Name = "Subtotal"
    };
    

ワークフロー デザイナーでの Interop アクティビティの使用

この例では、ワークフロー デザイナーを使用してワークフローを作成します。このワークフローは前の例と同じ機能ですが、WriteLine を使用して割引を表示するのではなく、ワークフローの完了時にホスト アプリケーションで割引情報を取得および表示するという点が異なります。また、データを含むローカル ワークフロー変数を使用するのではなく、ワークフローの呼び出し時に、引数がワークフロー デザイナーで作成され、値はホストから渡されます。

ワークフロー デザイナーで作成したワークフローを使用して PolicyActivity をホストするには

  1. ソリューション エクスプローラーWorkflow1.xaml を右クリックし、[削除] をクリックします。[OK] をクリックして確定します。

  2. ソリューション エクスプローラー[PolicyInteropHost] を右クリックし、[追加][新しい項目] をクリックします。

  3. [Visual C# アイテム] ノードを展開し、[ワークフロー] を選択します。[Visual C# アイテム] リストで [アクティビティ] を選択します。

  4. [名前] ボックスに「DiscountWorkflow」と入力し、[追加] をクリックします。

  5. ワークフロー デザイナーの左下にある [引数] をクリックし、[引数] ペインを表示します。

  6. [引数の作成] をクリックします。

  7. [名前] ボックスに「Subtotal」と入力し、[方向] ボックスで [IN] を選択して、[引数の型] ボックスで [Double] を選択し、Enter キーを押して引数を保存します。

    Ee264174.note(ja-jp,VS.100).gif注 :
    [Double][引数の型] ボックスにない場合、[型の参照] を選択し、[型の名前] ボックスに「System.Double」と入力し、[OK] をクリックします。

  8. [引数の作成] をクリックします。

  9. [名前] ボックスに「DiscountPercent」と入力し、[方向] ボックスで [Out] を選択して、[引数の型] ボックスで [Double] を選択し、Enter キーを押して引数を保存します。

  10. [引数の作成] をクリックします。

  11. [名前] ボックスに「Total」と入力し、[方向] ボックスで [Out] を選択して、[引数の型] ボックスから [Double] を選択し、Enter キーを押して引数を保存します。

  12. ワークフロー デザイナーの左下にある [引数] をクリックし、[引数] ペインを閉じます。

  13. [ツールボックス][制御フロー] セクションから Sequence アクティビティをドラッグし、ワークフロー デザイナー画面にドロップします。

  14. [ツールボックス][移行] セクションから Interop アクティビティをドラッグし、Sequence アクティビティにドロップします。

  15. [クリックして参照] ラベルの Interop アクティビティをクリックし、[型の名前] ボックスに「DiscountCalculator」と入力し、[OK] をクリックします。

    Ee264174.note(ja-jp,VS.100).gif注 :
    Interop アクティビティをワークフローに追加し、DiscountCalculator 型を ActivityType として指定すると、Interop アクティビティは 3 つの In 引数と 3 つの Out 引数を公開します。これは DiscountCalculator アクティビティの 3 つのパブリック プロパティを表します。In 引数の名前は、3 つのパブリック プロパティと同じです。また、3 つの Out 引数は、プロパティ名に「Out」を付加した名前と同じです。次の手順では、前の手順で作成したワークフロー引数を、Interop アクティビティの引数にバインドします。

  16. [DiscountPercentOut] プロパティの右にある [VB の式を入力してください] ボックスに「DiscountPercent」と入力し、Tab キーを押します。

  17. [Subtotal] プロパティの右にある [VB の式を入力してください] ボックスに「Subtotal」と入力し、Tab キーを押します。

  18. [TotalOut] プロパティの右にある [VB の式を入力してください] ボックスに「Total」と入力し、Tab キーを押します。

  19. ソリューション エクスプローラーProgram.cs を右クリックし、[コードの表示] をクリックします。

  20. ファイルの先頭に次の using ステートメントを追加します。

    using System.Collections.Generic;
    
  21. Main メソッドに含まれる CalculateDiscountInCode メソッドの呼び出しをコメント アウトし、次のコードを追加します。

    Ee264174.note(ja-jp,VS.100).gif注 :
    前の手順を実行せず、既定の Main コードのままの場合、Main の内容を次のコードに置き換えます。

    static void Main(string[] args)
    {
        CalculateDiscountUsingDesignerWorkflow();
        //CalculateDiscountUsingCodeWorkflow();
    }
    
  22. 次のコードを含む CalculateDiscountUsingDesignerWorkflow と呼ばれる Program クラスで新しいメソッドを作成します。

    static void CalculateDiscountUsingDesignerWorkflow()
    {
        double SubtotalValue = 125.99;
        Dictionary<string, object> wfargs = new Dictionary<string, object>
        {
            {"Subtotal", SubtotalValue}
        };
    
        Activity wf = new DiscountWorkflow();
    
        IDictionary<string, object> outputs =
            WorkflowInvoker.Invoke(wf, wfargs);
    
        Console.WriteLine("Subtotal: {0:C}, Discount {1}%, Total {2:C}",
            SubtotalValue, (double)outputs["DiscountPercent"] * 100,
            outputs["Total"]);
    }
    
  23. Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドし、実行します。異なる Subtotal の額を指定するには、次のコードの SubtotalValue 値を変更します。

    double SubtotalValue = 125.99; // Change this value.
    

ルール機能の概要

WF ルール エンジンは、フォワード チェーンをサポートする優先順位に基づく方法で、ルールの処理をサポートしています。単一のアイテムまたはコレクション内のアイテムについて、ルールを評価できます。ルールの概要および特定のルール機能に関する情報については、次の表を参照してください。

ルール機能 ドキュメント

ルールの概要

「Windows Workflow Foundation ルール エンジン入門」

RuleSet

ワークフロー内での RuleSet の使用」および「RuleSet

ルールの評価

「RuleSet 内のルール評価」

ルール チェーン

フォワード チェーン コントロール」および「ルールのフォワード チェーン

ルール内コレクションの処理

「ルール内コレクションの処理」

PolicyActivity の使用

PolicyActivity アクティビティの使用」および「PolicyActivity

.NET Framework 4 で作成したワークフローでは、たとえば宣言的アクティビティ条件や条件付きアクティビティ (ConditionedActivityGroupReplicatorActivity など) など、WF に用意されているルール機能のすべてを使用するわけではありません。必要に応じて、この機能は .NET Framework 3.0 および .NET Framework 3.5 を使用して作成したワークフローに使用できます。詳細については、次のトピックを参照してください。ワークフローの移行.