ActivityBuilderによる機能追加
こうして実現した先ほどのリホスティングデザイナですが、実はVisual Studioでのワークフローデザイナーとは一か所違いがあります。
上記画像を見てもらうと分かりますが、Visual Studio上では「引数」と表示がされていますが、リホスティングデザイナではその表示がありません。この点に対応するためにはActivityBuilderクラスという、アクティビティにプロパティデータを追加するクラスを利用します。利用方法は簡単で、ActivityBuilder.Implementation プロパティに、プロパティデータを追加するワークフロー(親となるアクティビティ)を指定します。
Dim actBld As New ActivityBuilder With {
.Implementation = New Sequence}
wfDesign.Load(actBld)
var seq = new Sequence();
seq.Activities.Add(new WriteLine {Text = "CodeZine"});
var actBld = new ActivityBuilder {Implementation = seq};
wfDesign.Load(actBld);
先ほどのサンプルコードではwfDesign.Load(New Sequence)として、ワークフローデザイナーに直接Sequenceアクティビティを読み込ませていましたが、ActivityBuilderクラスを利用する場合は、Implementationプロパティでアクティビティを指定した状態にしてから、ワークフローデザイナーに読み込ませます。
実行した際の画面は上記のようになります。先ほどのVisual Studio上でのワークフローデザイナーと同じく、「引数」も表示されているのが分かると思います。
ここで設定する内容ですが、ワークフロー実行時に受け取ることができる値、まさしく引数についての設定を行います。
ActivityBuilderクラスによるプロパティデータの追加ですが、ワークフローサービスの際には利用できません。これは通常のプログラムと異なり、サービスアプリケーションとしてはそれほど引数で値をやりとりする必要性が薄いためだと思われます。
上図は引数を利用した単純なワークフローのサンプルです。argument1という文字型の引数を1つ設定し、規定値として“WF4!”と設定しています。ワークフロー自体は、WriteLineアクティビティを利用してargument1の中身を標準出力に出力しています。このワークフローをそのまま実行すると、標準出力には規定値として設定したWF4!という文字列が表示されますが、ワークフローの実行時に以下のようにして引数を渡すことができます。
Dim args As New Dictionary(Of String, Object)
args.Add("argument1", "CodeZine WF4!")
WorkflowInvoker.Invoke(New Workflow1(), args)
Console.ReadKey()
var argments = new Dictionary< String, Object>();
argments.Add("argument1", "CodeZine WF4!");
WorkflowInvoker.Invoke(new Workflow1(), argments);
Console.ReadKey();
サンプルコードを実行すると上図のような結果になります。引数として渡した値がWriteLineアクティビティを通して標準出力より出力されているのが分かると思います。
このような形で引数を用いてワークフローへと値を渡すことができますが、注意点があります。WorkflowInvoker.Invokeメソッドの引数として、値を受け渡していますがそこで利用できるのはDictionary(Of String, Object)ジェネリックコレクション(C#であれば Dictionary<string, object>)のように、キー名がstring、値はobjectである必要があります。そしてキー名の文字列は大文字小文字を区別しますので、指定の際には注意が必要です。ここで引数の名前指定を誤ると実行時例外が発生しますので、利用する際には大文字小文字には特に注意を払ってください。
