WF 4.5 新機能 (Design Experience 向上)


環境 :
Visual Studio 2012 RC (.NET Framework 4.5 RC)

WF 4.5 新機能

こんにちは。

思い出したような投稿ですみません。先日 Caching のネタを書いたときに、WF 4.5 (.NET Framework 4.5 の WF) の話も書いてなかったことを後悔しましたので、今回 記載しておきたいと思います。(こちらも、これまで連載で書いてきてましたので。。。)

キャッチアップされている方にとっては「今さら」感 満載なのですが、WF 4.5 については、昨年の BUILD でもセッションで紹介されていましたし、最近だと Tech Ed 2012 (US) のセッションでも紹介されていますので、英語に抵抗がない方は、是非、ストリーミングなどを参照してください。
また、日本のリソースを検索してみると、てすとぶろぐ さんも素早く情報提供されていますので、参考にしてみてください。 

さて、WF 4.5 の新機能ですが、ざっと私なりに新機能を概観すると、次の 3 つに大別されるでしょう。

まず、StateMachine Workflow のサポート、Workflow における部分信頼 (Partial Trust) のサポートなど、これまで .NET 4 Platform Update (4.0.1 - 4.0.3) として追加で提供されてきた更新がすべて含まれているという点です。(.NET 4 Platform Update ですが、私のブログは .NET 4 Platform Update 1 しか紹介していませんでしたが、実は、.NET 4 Platform Update 3 まであります。)
つぎが、今日紹介する Design 系の進化の話です。後述するように、Designer そのものの使い勝手も良くなっていますし、新しい Design 手法への対応もあります。
最後が、WF 4.5 の一番大事な新機能だと思いますが、バージョン操作ができるようになっているという点です。これは、ちょっと今回まとめて書くのはあまりに長文になってしまいそうなので、次回にわけて記載したいと思います。

ということで、今週は、WF 4.5 の Design 系の進化について紹介したいと思います。もちろん、Visual Studio 2012 RC をダウンロードして すぐ試すことができます。

 

Workflow Designer の新機能

では、まず、Workflow Designer がどのように使いやすくなったか見てみましょう。
結構ありますので、箇条書きします。

  • 従来、Activity に挿入する Expression として VB 式しか設定できませんでしたが (「WF 4: コードいらずのワークフロー」を参照)、今回から、C# 式 (C# Expression) が入力できるようになっています。これについては、若干注意点があるので、このあと補足します。
  • Workflow のアウトライン表示が可能です (つまり、Tree 形式で階層表示できます。Designer Rehosting でも使用できます)
  • Workflow Designer 上で検索 (Find) ができます
  • アクティビティへコメント (annotation) を挿入できます
  • 一部アクティビティが追加されています (RC 版では、NoPersistScope, InvokeDelegate)
  • その他、activity の複数選択、activity どうしの自動接続、Sequence アクティビティの自動挿入、など、いろいろと細やかな改善がおこなわれています (ここは、実際、さわってみてください)

C# 式を挿入すると、.xaml ファイルには専用のタグが付与された式が設定されます。(互換性に配慮し、VB 式の場合は、.xaml に、これまでと同じフォーマットで記述されます。) Visual Studio の IDE では、既定で、Visual Basic のプロジェクトの場合は VB 式 (VB Expression)、C# のプロジェクトの場合は C# 式 (C# Expression) を使うようになっています。

なお、Designer Rehosting (デザイナー リホスティング) を活用している方は、上述の新機能に注意してください。(てすとぶろぐさんも、「WF 4.5 における新機能のオンオフ」に注意点として記載されています。)
互換性に配慮して、新機能の利用を明示しない限り、Designer Rehosting で新機能を使うことはできないようになっています。例えば、上述の Annotation を Designer Rehosting で使えるようにするには、下記 太字の通りコードを追加します。
また、アクティビティ検索や C# Expression は、Designer Rehosting ではサポートされていませんので注意してください。

...

// register designer metadata of Activities
DesignerMetadata metadata = new DesignerMetadata();
metadata.Register();

// create workflow designer
WorkflowDesigner designer = new WorkflowDesigner();

// use annotation (wf 4.5 new feature !)
designer.Context.Services.
  GetService<DesignerConfigurationService>().AnnotationEnabled

    = true;
designer.Context.Services.
  GetService<DesignerConfigurationService>().TargetFrameworkName

    = new System.Runtime.Versioning.FrameworkName(".NETFramework",
          new Version(4, 5));


// insert "Sequence" activity
// (we must call "Load" once !)
designer.Load(new Sequence());

// insert UIElement (designer view, property view)
DesignerArea.Child = designer.View;
PropertyArea.Child = designer.PropertyInspectorView;

...

 

Contract-First

もう 1 つ、Design 関連で見逃せない新機能として、ワークフロー サービス (Workflow Service) における Contract-First があります。従来の WF 4 でワークフロー サービスを構築する場合、ワークフロー (アクティビティ) の実装をしながら、Service Contract 名 (ServiceContractName) やオペレーション名 (OperationName) を設定しました。つまり、Contract を定義しながらワークフローを実装するという、定義と実装を混在しながら構築するスタイルでした。
WF 4.5 では、先に Contract を定義して、この Contract を使ったワークフローをあとから実装できます。

Visual Studio で、WCF ワークフロー サービス アプリケーションを作成します。例えば、プロジェクトに [クラス] ファイルを追加し、下記の通りコードを実装します。(つまり、コントラクトを定義します。)

. . .
using System.ServiceModel;
using System.Runtime.Serialization;
. . .

[ServiceContract]
public interface IOrderService
{
  [OperationContract]
  OrderItem StartOrder(string ProductId, int Count);
  [OperationContract(IsOneWay=true)]
  void ReceiveOrder(OrderItem Order);
}

[DataContract(Namespace = "")]
public class OrderItem
{
  [DataMember]
  public Guid OrderId;
  [DataMember]
  public string ProductId;
  [DataMember]
  public int Count;
  [DataMember]
  public string Process;
}
. . .

いったんリビルドをおこなってから、プロジェクトを右クリックして、[サービス コントラクトのインポート] (Import Service Contract) を選択します。

表示される画面で、下図の通り、上記で作成した IOrderService を選択して [OK] ボタンを押します。

プロジェクトをビルドしなおし、.xamlx ファイル (ワークフロー デザイナー) を開くと、下図の通り、上記で作成したコントラクトがアクティビティとして選択可能になります。

このようにデザイナーにコントラクトをインポートした場合、その実体は、アクティビティ クラス (.xaml ファイル) として、プロジェクトの「Service Contracts」の名前のサブ フォルダーに展開されます。デザイナーに追加されたこのコントラクトを削除するには、Visual Studio のソリューション エクスプローラーで、プロジェクトの「Service Contracts」フォルダーにあるコントラクト (下図) を削除すれば OK です。

また、ツールボックス上に追加されたアクティビティの名前に注目してください。(上図の StartOrder_ReceiveAndSendReply と ReceiveOrder_Receive です。)
例えば、StartOrder オペレーションは、上述のコードの通り、引数と返り値を持つ Request-Reply 型のオペレーションです。このため、Receive アクティビティと SendReply アクティビティのシーケンスとして展開されます。一方、ReceiveOrder オペレーションは、上述のコードの通り oneway オペレーションであるため、Receive アクティビティのみに展開されます。
このように、性質に応じた適切なメッセージ タイプに展開してくれるので、Contract を作成する際には、上記の通り、IsOneWay などの属性をちゃんと設定しておいてください。

さいごに、ワークフロー (.xamlx) のプロパティ ウィンドウを表示して、[ImplementedContracts] のボタン (下図) をクリックし、上記の IOrderService を追加します。これで、上図 ツールボックスの ReceiveOrder_Receive と StartOrder_ReceiveAndSendReply を使用したワークフロー作成が可能になります。

以降の使い方は、これまでの WF 4 における Receive アクティビティ、SendReply アクティビティなどの使い方と同じです。上図 ツールボックスの StartOrder_ReceiveAndSendReply や ReceiveOrder_Receive をドラッグ アンド ドロップして挿入し、引数や返り値、Correlation の設定などをおこないます。手順の詳細は、WF 入門 (10 行シリーズ) の「ワークフローを使用したサービスの作成」、「ワークフロー サービスにおける状態の維持 (Correlation の使用)」に記載されているので参照してください。(ここでは、手順の説明は割愛します。)

無論、定義されているオペレーションをすべて実装する必要があるので注意してください。(例えば、上記の場合、StartOrder_ReceiveAndSendReply アクティビティと ReceiveOrder_Receive アクティビティの双方を使ってワークフローを作成する必要があります。) また、Contract-First で作成したワークフローに、従来の Receive、SendReply アクティビティなど使ってオペレーションを追加することもできますが、ServiceContractName 名を変更し、別の Contract (つまり、別のインターフェイスのオペレーション) として追加する必要があるので注意してください。Contract-First で作成する場合は、一貫して、できるだけ最初にすべてのオペレーションを定義してから、実装するのが良いでしょう。

なお、ここではサンプルのため、同じプロジェクト内にコントラクトを定義しましたが、もちろん、Contract は別の dll (ライブラリー) として作成し、その dll を参照追加して構築することもできます。(というか、現実の開発では、こういうスタイルでの開発になるでしょう。) また、WCF 4.5 の新機能 の 1 つである wsdl からの Contract 作成と組み合わせると、wsdl の定義を元にワークフロー サービスを構築することも可能です。

 

関連ナンバー

 

 

Comments (0)

Skip to main content