Workflow では実行されるワークフローと、ホストするアプリケーション等外部アプリと連携するための仕組みとしてブックマークがあります。ただし連携する方向は、ホストアプリケーション→ワークフロー、という一方のみです。CodeRecipe を参考に、動作サンプルとしてブックマークを作成しホストアプリケーションから値を受け取るアクティビティを作成します。
1: Imports System.Activities
2:3: Public Class CooperationHostActivity4: Inherits NativeActivity
5:6: Public Property BookmarkName As String7: Public Property HostedValue As OutArgument(Of String)8:9: Protected Overrides ReadOnly Property CanInduceIdle As Boolean10: Get
11: Return True12: End Get13: End Property14:15: Protected Overloads Overrides Sub Execute(ByVal context As System.Activities.NativeActivityContext)16: If Me.BookmarkName.Trim = "" Then Return17: context.CreateBookmark(Me.BookmarkName, New BookmarkCallback(AddressOf OnResume))18: End Sub19:20: Private Sub OnResume(ByVal context As NativeActivityContext, ByVal bookmark As Bookmark, ByVal value As Object)21: context.SetValue(Me.HostedValue, value)
22: End Sub23:24: End Class
継承元が NativeActivity となっているのを除けば、今までと大差ない内容です。ブックマークを Execute メソッドにて作成していますが、この際ブックマークが呼び出された際のメソッドをコールバックとして登録しておく必要があります。このアクティビティを利用して次のようなワークフローを作成します。
ブックマークを作成しホスト側より値を受け取り、その内容を表示する単純なワークフローです。今回は Writeline アクティビティを利用したため、ホストアプリケーションはコンソールアプリケーションとして用意しました。
1: Imports System.Threading
2: Imports System.Activities
3: Imports System.Activities.XamlIntegration
4:5: Module Module16: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 Sub15: _wfApps.Run()16:17: Console.WriteLine("何か値を入力してください")
18: _wfApps.ResumeBookmark("TestBookmark", Console.ReadLine())
19:20: resetEvent.WaitOne()21: Console.ReadLine()22:23: End Sub24:25: End Module
ホスト側アプリケーションはこのような形で用意しました。先に用意したワークフローを呼び出し実行、コンソールで適当な値を入力させ、その値をブックマークに対して送り出しています。今回は文字列にて呼び出すブックマーク名を設定していますが、ここは Bookmark クラスのインスタンスを設定する事も可能です。
実行するとこのようになります。最終行の文言はワークフロー側から表示が行われていますが、そこまでの 2 行はホスト側アプリケーションによる表示です。このようにブックマークを利用する事で、ワークフローとアプリケーションとの間で連携を取ることができるようになります。ワークフローエンジン上で重複禁止なので、ブックマークの名前付けには気を付ける必要がありますが・・・
0 件のコメント:
コメントを投稿