2011年4月4日月曜日

UI と Activity の連携(1)

Workflow と Activity、そしてフォームやコンソールなどの UI との連携は何通りも方法があります。最初は最も手っ取り早い方法、Activity 内部で画面を生成してやりとりするやり方を。

Protected Overrides Sub Execute(ByVal context As CodeActivityContext)

    Dim inputText As String = ""
    Using dlg As New Form1
        dlg.ShowDialog()
        inputText = dlg.result
    End Using

    context.SetValue(Me.Result, inputText)
End Sub

例えば適当な Form を用意してそれを Activity 実行時に表示、入力された値を Form のプロパティとして戻してもらうような Activity にします。この際、Activity のプロパティは InArgument や OutArgument を利用するのがベターですが、呼び出される Form 側ではなんでも構いません。実際に利用する場合は、何らかの構造体や DataSet ライクなクラスを用意するのがやりやすいのではないか、と思います。

そしてこのような感じで Workflow を定義。

WF4_1

InputDialog と書かれている Activity が上記サンプルコードの Activity、Display と表示されているのが、前回のサンプルでも利用した渡されたプロパティを表示するだけの Activity です。

Activity を Workflow に設定後、変数を定義し UI と Activity の間で利用するようにします。作成した変数名を InputDialog・DIsplay それぞれの Activity にて受け渡し用に定義したプロパティに設定します。ここで「変数名」を設定するのが通常のプロパティとちょっと異なるところです。その後実行すると、

WF4_2

本気で適当に用意した Form が表示されます。適当な文章を入力し OK ボタンを押すと、呼び出し元の Activity.Execute メソッド内部で Context を通した形で Workflow 上の変数に値が設定されます。

WF4_3

DIsplayActivity 側では、設定された変数名を Context から取得、そのまま表示されます。

このような形で非常に簡単に Activity 間での情報のやりとりが可能になってます。これを発展させると、UI 部と処理ロジックが「完全」に分離させることができるようになります。そしてそのロジック部分は上記のような Workflow ですので、プログラマでなくとも処理の変更が可能になります。勿論、Activity 等の作り込み次第で更に簡単に、または難しくなることはありますが、非常に保守性の高いアプリケーションをより作成しやすくなるのは間違いないのではないか、と思います。

0 件のコメント:

コメントを投稿