.NET Framework 4 ワークフローでの相互運用アクティビティの使用
このトピックの内容は、Windows Workflow Foundation 4 に該当します。
.NET Framework 3.0 または .NET Framework 3.5 を使用して作成したアクティビティは、Interop アクティビティを使うことにより .NET Framework 4 ワークフローで使用できます。ここでは、Interop アクティビティの概要について説明します。
Visual Basic 注 : |
---|
Interop アクティビティをワークフロー デザイナー ツールボックスに表示するには、ワークフローのプロジェクトで [ターゲット フレームワーク] を [.NET Framework 4] に設定します。 |
.NET Framework 4 ワークフローでの相互運用アクティビティの使用
このトピックでは、DiscountCalculator
アクティビティを含む .NET Framework 3.5 アクティビティ ライブラリを作成します。DiscountCalculator
は、購入額に基づいて割引を計算し、PolicyActivity を含む SequenceActivity で構成されます。
注 : |
---|
このトピックで作成する .NET Framework 3.5 アクティビティでは、PolicyActivity を使用してアクティビティのロジックを実装します。.NET Framework 4 ワークフローでルールを使用するためにカスタムの .NET Framework 3.5 アクティビティまたは Interop アクティビティを使用する必要はありません。Interop アクティビティを使用せずに .NET Framework 4 ワークフローでルールを使用する例については、.NET Framework 4 のポリシー アクティビティ のサンプルを参照してください。 |
.NET Framework 3.5 アクティビティ ライブラリ プロジェクトを作成するには
Visual Studio 2010 を開き、[ファイル] メニューの [新規作成] の [プロジェクト] をクリックします。
[インストールされたテンプレート] ペインの [その他のプロジェクトの種類] を展開し、[Visual Studio ソリューション] をクリックします。
[Visual Studio ソリューション] リストで [空のソリューション] を選択します。[名前] ボックスに「PolicyInteropDemo」と入力し、[OK] をクリックします。
ソリューション エクスプローラーで [PolicyInteropDemo] を右クリックし、[追加] の [新しいプロジェクト] をクリックします。
ヒント : ソリューション エクスプローラー ウィンドウが表示されない場合は、[表示] メニューの [ソリューション エクスプローラー] をクリックします。 [インストールされているテンプレート] リストで、[Visual C#] の [ワークフロー] を選択します。.NET Framework バージョンのドロップダウン リスト ボックスで [.NET Framework 3.5] を選択し、[テンプレート] リストで [ワークフロー アクティビティ ライブラリ] を選択します。
[名前] ボックスに「PolicyActivityLibrary」と入力し、[OK] をクリックします。
ソリューション エクスプローラーで Activity1.cs を右クリックし、[削除] をクリックします。[OK] をクリックして確定します。
DiscountCalculator アクティビティを作成するには
ソリューション エクスプローラーで [PolicyActivityLibrary] を右クリックし、[追加] の [アクティビティ] をクリックします。
[Visual C# アイテム] リストで [アクティビティ (コード分離付き)] を選択します。[名前] ボックスに「DiscountCalculator」と入力し、[OK] をクリックします。
ソリューション エクスプローラーで DiscountCalculator.xoml を右クリックし、[コードの表示] をクリックします。
DiscountCalculator
クラスに次の 3 つのプロパティを追加します。public partial class DiscountCalculator : SequenceActivity { public double Subtotal { get; set; } public double DiscountPercent { get; set; } public double Total { get; set; } }
ソリューション エクスプローラーで DiscountCalculator.xoml を右クリックし、[ビュー デザイナー] をクリックします。
[ツールボックス] の [Windows Workflow v3.0] セクションの Policy アクティビティをドラッグして、DiscountCalculator アクティビティにドロップします。
ヒント : [ツールボックス] ウィンドウが表示されていない場合は、[表示] メニューの [ツールボックス] をクリックします。
ルールを構成するには
新しく追加した Policy アクティビティが選択されていない場合は、クリックして選択します。
[プロパティ] ウィンドウの RuleSetReference プロパティをクリックして選択し、プロパティの右にある省略記号ボタンをクリックします。
ヒント : [プロパティ] ウィンドウが表示されていない場合は、[表示] メニューの [プロパティ ウィンドウ] を選択します。 [新規] をクリックします。
[ルールの追加] をクリックします。
[条件] ボックスに、次の式を入力します。
this.Subtotal >= 50 && this.Subtotal < 100
[THEN アクション] ボックスに、次の式を入力します。
this.DiscountPercent = 0.075
[ルールの追加] をクリックします。
[条件] ボックスに、次の式を入力します。
this.Subtotal >= 100
[THEN アクション] ボックスに、次の式を入力します。
this.DiscountPercent = 0.15
[ルールの追加] をクリックします。
[条件] ボックスに、次の式を入力します。
this.DiscountPercent > 0
[THEN アクション] ボックスに、次の式を入力します。
this.Total = this.Subtotal - this.Subtotal * this.DiscountPercent
[ELSE アクション] ボックスに、次の式を入力します。
this.Total = this.Subtotal
[OK] をクリックして、[ルール セット エディター] ダイアログ ボックスを閉じます。
[名前] リストで新しく作成された RuleSet が選択されていることを確認し、[OK] をクリックします。
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
アクティビティの Subtotal
、DiscountPercent
、および Total
の各プロパティ値が評価および変更され、目的の割引が計算されます。
DiscountCalculator アクティビティと相互運用アクティビティの使用
.NET Framework 4 ワークフロー内で DiscountCalculator
アクティビティを使用するには、Interop アクティビティを使用します。ここでは、2 つのワークフローを作成します。1 つはコードを使用し、1 つはワークフロー デザイナーを使用します。また、Interop アクティビティと DiscountCalculator
アクティビティを使用する方法について説明します。両方のワークフローに同じホスト アプリケーションを使用します。
ホスト アプリケーションを作成するには
ソリューション エクスプローラーで [PolicyInteropDemo] を右クリックし、[追加] の [新しいプロジェクト] をクリックします。
.NET Framework バージョンのドロップダウン リスト ボックスで [.NET Framework 4] が選択されていることを確認し、[Visual C# アイテム] リストで [ワークフロー コンソール アプリケーション] を選択します。
[名前] ボックスに「PolicyInteropHost」と入力し、[OK] をクリックします。
ソリューション エクスプローラーで [PolicyInteropHost] を右クリックし、[プロパティ] をクリックします。
[ターゲット フレームワーク] ボックスで、[.NET Framework 4 Client Profile] の選択を [.NET Framework 4] に変更します。[はい] をクリックして確定します。
ソリューション エクスプローラーで [PolicyInteropHost] を右クリックし、[参照の追加] をクリックします。
[プロジェクト] タブの [PolicyActivityLibrary] をクリックし、[OK] をクリックします。
ソリューション エクスプローラーで [PolicyInteropHost] を右クリックし、[参照の追加] をクリックします。
[.NET] タブの [System.Workflow.Activities]、[System.Workflow.ComponentModel]、および [System.Workflow.Runtime] をクリックし、[OK] をクリックします。
ソリューション エクスプローラーで [PolicyInteropHost] を右クリックし、[スタートアップ プロジェクトに設定] をクリックします。
F6 キーを押してソリューションをビルドします。
コードでの Interop アクティビティの使用
この例では、Interop アクティビティおよび DiscountCalculator
アクティビティを含むコードを使用して、ワークフロー定義を作成します。このワークフローは、WorkflowInvoker を使用して呼び出され、ルールの評価結果は、WriteLine アクティビティを使用してコンソールに書き込まれます。
コードで Interop アクティビティを使用するには
ソリューション エクスプローラーで Program.cs を右クリックし、[コードの表示] をクリックします。
ファイルの先頭に次の
using
ステートメントを追加します。using PolicyActivityLibrary;
Main
メソッドの内容を削除し、次のコードに置き換えます。static void Main(string[] args) { CalculateDiscountUsingCodeWorkflow(); }
次のコードを含む
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); }
注 : DiscountCalculator
アクティビティのSubtotal
、DiscountPercent
、およびTotal
の各プロパティは、Interop アクティビティの属性として表示され、Interop アクティビティの ActivityProperties コレクションのローカル ワークフロー変数にバインドされます。Subtotal
は In 引数として追加されますが、これはSubtotal
のデータ フローが Interop アクティビティに読み込まれるためです。また、DiscountPercent
およびTotal
は Out 引数として追加されますが、これはこれらのデータ フローが Interop アクティビティから出力されるためです。2 つの Out 引数は、Out 引数を表すことを示すために、DiscountPercentOut
およびTotalOut
という名前で追加されます。DiscountCalculator
タイプは、Interop アクティビティの ActivityType として指定されます。Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドし、実行します。
Subtotal
値を異なる値に置き換え、DiscountCalculator
アクティビティに用意されているさまざまな割引レベルをテストします。Variable<double> Subtotal = new Variable<double> { Default = 75.99, // Change this value. Name = "Subtotal" };
ワークフロー デザイナーでの Interop アクティビティの使用
この例では、ワークフロー デザイナーを使用してワークフローを作成します。このワークフローは前の例と同じ機能ですが、WriteLine を使用して割引を表示するのではなく、ワークフローの完了時にホスト アプリケーションで割引情報を取得および表示するという点が異なります。また、データを含むローカル ワークフロー変数を使用するのではなく、ワークフローの呼び出し時に、引数がワークフロー デザイナーで作成され、値はホストから渡されます。
ワークフロー デザイナーで作成したワークフローを使用して PolicyActivity をホストするには
ソリューション エクスプローラーで Workflow1.xaml を右クリックし、[削除] をクリックします。[OK] をクリックして確定します。
ソリューション エクスプローラーで [PolicyInteropHost] を右クリックし、[追加] の [新しい項目] をクリックします。
[Visual C# アイテム] ノードを展開し、[ワークフロー] を選択します。[Visual C# アイテム] リストで [アクティビティ] を選択します。
[名前] ボックスに「DiscountWorkflow」と入力し、[追加] をクリックします。
ワークフロー デザイナーの左下にある [引数] をクリックし、[引数] ペインを表示します。
[引数の作成] をクリックします。
[名前] ボックスに「Subtotal」と入力し、[方向] ボックスで [IN] を選択して、[引数の型] ボックスで [Double] を選択し、Enter キーを押して引数を保存します。
注 : [Double] が [引数の型] ボックスにない場合、[型の参照] を選択し、[型の名前] ボックスに「System.Double」と入力し、[OK] をクリックします。 [引数の作成] をクリックします。
[名前] ボックスに「DiscountPercent」と入力し、[方向] ボックスで [Out] を選択して、[引数の型] ボックスで [Double] を選択し、Enter キーを押して引数を保存します。
[引数の作成] をクリックします。
[名前] ボックスに「Total」と入力し、[方向] ボックスで [Out] を選択して、[引数の型] ボックスから [Double] を選択し、Enter キーを押して引数を保存します。
ワークフロー デザイナーの左下にある [引数] をクリックし、[引数] ペインを閉じます。
[ツールボックス] の [制御フロー] セクションから Sequence アクティビティをドラッグし、ワークフロー デザイナー画面にドロップします。
[ツールボックス] の [移行] セクションから Interop アクティビティをドラッグし、Sequence アクティビティにドロップします。
[クリックして参照] ラベルの Interop アクティビティをクリックし、[型の名前] ボックスに「DiscountCalculator」と入力し、[OK] をクリックします。
注 : Interop アクティビティをワークフローに追加し、 DiscountCalculator
型を ActivityType として指定すると、Interop アクティビティは 3 つの In 引数と 3 つの Out 引数を公開します。これはDiscountCalculator
アクティビティの 3 つのパブリック プロパティを表します。In 引数の名前は、3 つのパブリック プロパティと同じです。また、3 つの Out 引数は、プロパティ名に「Out」を付加した名前と同じです。次の手順では、前の手順で作成したワークフロー引数を、Interop アクティビティの引数にバインドします。[DiscountPercentOut] プロパティの右にある [VB の式を入力してください] ボックスに「DiscountPercent」と入力し、Tab キーを押します。
[Subtotal] プロパティの右にある [VB の式を入力してください] ボックスに「Subtotal」と入力し、Tab キーを押します。
[TotalOut] プロパティの右にある [VB の式を入力してください] ボックスに「Total」と入力し、Tab キーを押します。
ソリューション エクスプローラーで Program.cs を右クリックし、[コードの表示] をクリックします。
ファイルの先頭に次の
using
ステートメントを追加します。using System.Collections.Generic;
Main
メソッドに含まれるCalculateDiscountInCode
メソッドの呼び出しをコメント アウトし、次のコードを追加します。注 : 前の手順を実行せず、既定の Main
コードのままの場合、Main
の内容を次のコードに置き換えます。static void Main(string[] args) { CalculateDiscountUsingDesignerWorkflow(); //CalculateDiscountUsingCodeWorkflow(); }
次のコードを含む
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"]); }
Ctrl キーを押しながら F5 キーを押してアプリケーションをビルドし、実行します。異なる
Subtotal
の額を指定するには、次のコードのSubtotalValue
値を変更します。double SubtotalValue = 125.99; // Change this value.
ルール機能の概要
WF ルール エンジンは、フォワード チェーンをサポートする優先順位に基づく方法で、ルールの処理をサポートしています。単一のアイテムまたはコレクション内のアイテムについて、ルールを評価できます。ルールの概要および特定のルール機能に関する情報については、次の表を参照してください。
ルール機能 | ドキュメント |
---|---|
ルールの概要 |
|
RuleSet |
「ワークフロー内での RuleSet の使用」および「RuleSet」 |
ルールの評価 |
|
ルール チェーン |
|
ルール内コレクションの処理 |
|
PolicyActivity の使用 |
「PolicyActivity アクティビティの使用」および「PolicyActivity」 |
.NET Framework 4 で作成したワークフローでは、たとえば宣言的アクティビティ条件や条件付きアクティビティ (ConditionedActivityGroup、ReplicatorActivity など) など、WF に用意されているルール機能のすべてを使用するわけではありません。必要に応じて、この機能は .NET Framework 3.0 および .NET Framework 3.5 を使用して作成したワークフローに使用できます。詳細については、次のトピックを参照してください。ワークフローの移行.