2011年9月29日木曜日

起動時にワークフローの引数を設定する

CodePlex にて開発中のデザイナ、細かいところをアップデートしてみました。
今回はコンソール実行用モジュールにて引数をコマンドラインオプションで渡せるようにしてみまして、このあたりをやってみて気付いた点があったので記載しておきます。
ワークフローの引数自体は、作成している(または ActivityXamlServices.Load 等で読み込んだ)ワークフローを DynamicActivity にキャストした形で扱う事で設定が可能です。
   1: wfFile = ActivityXamlServices.Load(target)
   2: '引数が存在するかチェック
   3: Dim dynAct = TryCast(wfFile, DynamicActivity)
   4: If (dynAct IsNot Nothing) Then
   5:     For Each child In SetWorkflowArgument(argument).Keys()
   6:         If Not CheckWorkflowArgument(dynAct, child) Then Continue For
   7:  
   8:         If wfArgs Is Nothing Then wfArgs = New Dictionary(Of String, Object)
   9:         wfArgs.Add(child, GetArgumentValue(argument, child))
  10:     Next
  11: End If
  12:  
  13: ''' <summary>ワークフローの引数を設定</summary>
  14: Private Function SetWorkflowArgument(ByVal args As String()) As Dictionary(Of String, Object)
  15:     Dim result As New Dictionary(Of String, Object)
  16:     Dim r = From x In args
  17:             Where x.StartsWith("/")
  18:             Select x.Replace("/", "")
  19:  
  20:     For Each child In r
  21:         If (Not child.Contains(":")) OrElse
  22:             (child.Contains("wfile:")) Then Continue For
  23:  
  24:         Dim splitPosition = child.IndexOf(":")
  25:         result.Add(child.Substring(0, splitPosition), child.Substring(splitPosition + 1))
  26:     Next
  27:     Return result
  28: End Function
  29:  
  30: ''' <summary>ワークフローに引数が存在するかチェック</summary>
  31: Private Function CheckWorkflowArgument(ByVal wf As DynamicActivity, ByVal argsName As String) As Boolean
  32:     Return wf.Properties.Contains(argsName)
  33: End Function
  34:  
  35: ''' <summary>コマンドライン引数から指定した名称の値を取得</summary>
  36: Private Function GetArgumentValue(ByVal args As String(), ByVal argsName As String) As Object
  37:     Dim r = From x In args
  38:                Where x.StartsWith("/" + argsName)
  39:                Select x.Replace("/" + argsName + ":", "")
  40:  
  41:     Return r.First
  42: End Function

ざっくりと書くとこのような感じのロジックになります。注意する点は、設定するワークフローの引数は実行時にチェックが行われ存在しない引数を渡した場合は例外が発生する点、引数は大文字小文字をチェックしている点、です。
今回のアプリではコマンドラインで渡されたとしても、ワークフロー上に存在しない引数名だった場合には渡さないようにしています。このあたりの制御が必要ですね。

0 件のコメント:

コメントを投稿