2011年4月27日水曜日

Bookmark を利用したワークフローとの連携

Workflow では実行されるワークフローと、ホストするアプリケーション等外部アプリと連携するための仕組みとしてブックマークがあります。ただし連携する方向は、ホストアプリケーション→ワークフロー、という一方のみです。CodeRecipe を参考に、動作サンプルとしてブックマークを作成しホストアプリケーションから値を受け取るアクティビティを作成します。

1: Imports System.Activities
2: 
3: Public Class CooperationHostActivity
4:     Inherits NativeActivity
5: 
6:     Public Property BookmarkName As String
7:     Public Property HostedValue As OutArgument(Of String)
8: 
9:     Protected Overrides ReadOnly Property CanInduceIdle As Boolean
10:         Get
11:             Return True
12:         End Get
13:     End Property
14: 
15:     Protected Overloads Overrides Sub Execute(ByVal context As System.Activities.NativeActivityContext)
16:         If Me.BookmarkName.Trim = "" Then Return
17:         context.CreateBookmark(Me.BookmarkName, New BookmarkCallback(AddressOf OnResume))
18:     End Sub
19: 
20:     Private Sub OnResume(ByVal context As NativeActivityContext, ByVal bookmark As Bookmark, ByVal value As Object)
21:         context.SetValue(Me.HostedValue, value)
22:     End Sub
23: 
24: End Class

継承元が NativeActivity となっているのを除けば、今までと大差ない内容です。ブックマークを Execute メソッドにて作成していますが、この際ブックマークが呼び出された際のメソッドをコールバックとして登録しておく必要があります。このアクティビティを利用して次のようなワークフローを作成します。

Bookmark0

ブックマークを作成しホスト側より値を受け取り、その内容を表示する単純なワークフローです。今回は Writeline アクティビティを利用したため、ホストアプリケーションはコンソールアプリケーションとして用意しました。

1: Imports System.Threading
2: Imports System.Activities
3: Imports System.Activities.XamlIntegration
4: 
5: Module Module1
6: 
7:     Sub Main()
8:         Dim resetEvent As New AutoResetEvent(False)
9:         Dim wfFile = ActivityXamlServices.Load("sample.xaml")
10:         Dim _wfApps As New System.Activities.WorkflowApplication(wfFile)
11:         'ワークフロー実行完了時に待機状態を終了する
12:         _wfApps.Completed = Sub(e As WorkflowApplicationCompletedEventArgs)
13:                                 resetEvent.Set()
14:                             End Sub
15:         _wfApps.Run()
16: 
17:         Console.WriteLine("何か値を入力してください")
18:         _wfApps.ResumeBookmark("TestBookmark", Console.ReadLine())
19: 
20:         resetEvent.WaitOne()
21:         Console.ReadLine()
22: 
23:     End Sub
24: 
25: End Module

ホスト側アプリケーションはこのような形で用意しました。先に用意したワークフローを呼び出し実行、コンソールで適当な値を入力させ、その値をブックマークに対して送り出しています。今回は文字列にて呼び出すブックマーク名を設定していますが、ここは Bookmark クラスのインスタンスを設定する事も可能です。

image

実行するとこのようになります。最終行の文言はワークフロー側から表示が行われていますが、そこまでの 2 行はホスト側アプリケーションによる表示です。このようにブックマークを利用する事で、ワークフローとアプリケーションとの間で連携を取ることができるようになります。ワークフローエンジン上で重複禁止なので、ブックマークの名前付けには気を付ける必要がありますが・・・

0 件のコメント:

コメントを投稿