1st Steps with
     Workflow



Ahf(小尾 智之)
自己紹介
• VB と SQL Server が主戦場
  – なんでもやりますよ
• インディープロレス・クマ(クマー含む)好き
  – もっふりしたもの全般好き
• WF メイニア目指して研鑽中
• @IT エンジニアライフでたまに書いてます
ハンズオンの流れ

•   コードのみで Workflow
•   アクティビティの実装
•   デザイナ リホスティング
•   アクティビティデザイナー
    時間次第で フローチャート 型
    ワークフロー?
注意事項

• ハンズオン中は自由に入退室可能
  自分のペースで調整してください
• おかしいところは気軽に質問を!
  分からないところも気軽に!
開発環境について
• WF 4
  – Visual Studio 2010 Professional 以降
  – Express Edition はデザイナを自作で対応



                       かなり簡単にこのような
                       自作デザイナを作成できます
1:コードのみで Workflow

• コードのみでも利用可能
Sub Main()
    Dim seq As New Sequence
    Dim activity1 As New WriteLine With
    {
         .Text = "CLR/H 61 Hands On !"
    }                                        FlowChart 型や
    seq.Activities.Add(activity1)
    Dim activity2 As New Delay With          Statemachine 型をコード
    {
         .Duration = New TimeSpan(0, 0, 5)
                                             のみで実装するのはお勧め
    }                                        できないどころか苦行
    seq.Activities.Add(activity2)

   Dim wfApp As New WorkflowInvoker(seq)
   wfApp.Invoke()
   Console.ReadLine()
 End Sub
コードのみが向くケース

• コンソールアプリケーション?
• コードで全て行うなら Workflow
  Foundation の意味がない

  Workflow Foundation を利用するなら
  デザイナからフローを設定する事を
  第一に考えよう!
2:アクティビティの実装

  • 実装自体は非常に簡単
Imports System.Activities

Public Class MargeActivity
  Inherits CodeActivity
                                                  通常のプログラミングと
                                                  全く同一
  Public Property Text As String = ""

  Protected Overrides Sub Execute(context As CodeActivityContext)
     System.Threading.Thread.Sleep(New TimeSpan(0, 0, 5))
     Console.WriteLine(Me.Text)
     Console.ReadLine()
  End Sub

End Class
                         既に用意されているクラスを
                         Execute メソッドより呼び出す
                         だけでも OK
アクティビティをどう作る?

• 処理の粒度がつきまとう
• 大きすぎても小さすぎても
  利用しづらくなってしまう
• ワークフロー上で利用するパーツ
  という点を最重要視する
3:デザイナ リホスティング

• WF の中心!
• とことんつきつめれば VS と
  同等(またはそれ以上)まで可能

  できるだけデザイナ上で設定が行えると
  非開発者向けに利用できると思われる
4:アクティビティ デザイナー

• デザイナ上でアクティビティを
  設定させる際に非常に重要
• 基本的な考え方は WPF そのまま
• バインディングは当然必須
Ex:ExpressionTextBox

  • VB 式を利用する事ができる
  • 記述したコードはリアルタイムに
    構文チェックなどが行われる
<sapv:ExpressionTextBox
          Expression="{Binding Path=ModelItem.CommentStrings, Mode=TwoWay,
                             Converter={StaticResource ArgumentToExpressionConverter},
                             ConverterParameter=In }"
          ExpressionType="s:String"
          OwnerActivity="{Binding Path=ModelItem}"
          AcceptsReturn="True" VerticalScrollBarVisibility="Auto" />


                     実際に利用する場合は少々記述量が増える…
Ex:Flowchart Workflow

• デザイナで最初に生成するのを
  Sequence から Flwochart に
• アクティビティが追加される
 –FlowNode とか
• 実行方法などはこれまでと一緒
まとめ

• WF は利用するのが非常に簡単
• アクティビティを色々実装すると
  コンポーネント化を進められる
• 保守性も可読性も向上
• とりあえずやってみよう!

Clrh 110827 wfho