WorkflowIdentity と Versioning の使用

WorkflowIdentity を使用すると、ワークフロー アプリケーションの開発者は、名前と Version をワークフロー定義に関連付け、永続化されたワークフロー インスタンスにこの情報を関連付けることができます。 この ID 情報は、ワークフロー アプリケーションの開発者がワークフロー定義の複数のバージョンの side-by-side 実行などのシナリオを有効にするために使用できます。また、動的更新などの他の機能の基礎となります。 このトピックでは、WorkflowIdentity ホスティングでの WorkflowApplication の使用の概要について説明します。 ワークフロー サービスでのワークフロー定義の side-by-side 実行については、「WorkflowServiceHost による side-by-side でのバージョン管理」を参照してください。 動的な更新については、「動的な更新」を参照してください。

このトピックの内容

WorkflowIdentity の使用

WorkflowIdentity を使用するには、インスタンスを作成および構成し、WorkflowApplication インスタンスに関連付けます。 WorkflowIdentity インスタンスには 3 種類の識別情報が格納されます。 NameVersion は必須で、名前と Version を表します。また、Package は省略可能で、アセンブリ名やその他の必要な情報などの情報を格納する追加文字列の指定に使用できます。 WorkflowIdentity は、その 3 つのプロパティのいずれかが他の WorkflowIdentity と異なる場合に一意です。

重要

WorkflowIdentity には、個人を特定できる情報 (PII) を含めないでください。 インスタンスの作成に使用される WorkflowIdentity に関する情報は、ランタイムによるアクティビティ ライフ サイクルのさまざまなポイントで構成されているすべての追跡サービスに出力されます。 WF の追跡には PII (機密ユーザー データ) を非表示にするメカニズムがありません。 そのため、WorkflowIdentity インスタンスには PII データを含めないでください。PII データは、ランタイムによって追跡レコードに出力され、追跡レコードを表示するためのアクセス権を持つユーザーに表示できます。

次の例では、WorkflowIdentity を作成し、MortgageWorkflow のワークフロー定義を使用して作成したワークフローのインスタンスに関連付けます。

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

ワークフローを再読み込みして再開すると、永続化されたワークフロー インスタンスの WorkflowIdentity と一致するように構成されている WorkflowIdentity を使用する必要があります。

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

ワークフロー インスタンスの再読み込み時に使用される WorkflowIdentity が永続化された WorkflowIdentity と一致しない場合は、VersionMismatchException がスローされます。 次の例では、前の例で永続化された MortgageWorkflow インスタンスで読み込み操作が行われます。 この読み込み操作は、永続化されたインスタンスと一致しない、住宅ローン ワークフローの新しいバージョン用に構成された WorkflowIdentity を使用して行われます。

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

前のコードが実行されると、次の VersionMismatchException がスローされます。

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

WorkflowIdentity を使用した side-by-side 実行

WorkflowIdentity を使用すると、ワークフローの複数のバージョンの side-by-side 実行を簡略化できます。 たとえば、実行時間の長いワークフローのビジネス要件を変更します。 ワークフローの多くのインスタンスは、更新されたバージョンを配置すると実行できます。 ホスト アプリケーションは、新しいインスタンスの開始時に更新されたワークフロー定義を使用するよう構成できます。また、インスタンスの再開時に適切なワークフロー定義を指定するのはホスト アプリケーションの役割です。 WorkflowIdentity を使用すると、ワークフロー インスタンスの再開時に、一致するワークフロー定義を特定して指定できます。

永続化されたワークフロー インスタンスの WorkflowIdentity を取得するには、GetInstance メソッドを使用します。 GetInstance メソッドは、永続化されたワークフロー インスタンスの Id、および永続化されたインスタンスを格納する SqlWorkflowInstanceStore を取得して、WorkflowApplicationInstance を返します。 WorkflowApplicationInstance には、永続化されたワークフロー インスタンスに関する情報 (関連付けられた WorkflowIdentity など) が格納されます。 この関連付けられた WorkflowIdentity は、ワークフロー インスタンスを読み込んで再開するときに、適切なワークフロー定義を指定するためにホストで使用できます。

注意

null の WorkflowIdentity は有効で、ホストで使用すると、関連付けられた WorkflowIdentity がない、永続化されたインスタンスを適切なワークフロー定義にマップできます。 このシナリオは、ワークフロー アプリケーションがワークフローのバージョン管理で最初に記述されなかった場合、またはアプリケーションが .NET Framework 4 からアップグレードされた場合に発生する可能性があります。 詳細については、「ワークフローのバージョン管理をサポートする .NET Framework 4 永続性データベースのアップグレード」を参照してください。

次の例では、Dictionary<WorkflowIdentity, Activity> を使用して WorkflowIdentity インスタンスがそれに対応するワークフロー定義に関連付けられ、identityV1WorkflowIdentity に関連付けられている MortgageWorkflow ワークフロー定義を使用してワークフローが開始されます。

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

次の例では、前の例の永続化されたワークフロー インスタンスに関する情報を GetInstance を呼び出すことによって取得し、永続化された WorkflowIdentity の情報を使用して一致するワークフロー定義を取得します。 この情報を使用して WorkflowApplication を構成すると、ワークフローが読み込まれます。 Load を受け取る WorkflowApplicationInstance オーバーロードが使用されるため、SqlWorkflowInstanceStore で構成された WorkflowApplicationInstanceWorkflowApplication によって使用され、その結果、その InstanceStore プロパティを構成する必要はありません。

注意

InstanceStore プロパティを設定する場合は、SqlWorkflowInstanceStore によって使用されるのと同じ WorkflowApplicationInstance インスタンスで設定する必要があります。そうしないと、ArgumentException がスローされ、"The instance is configured with a different InstanceStore than this WorkflowApplication." というメッセージが表示されます。

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

ワークフローのバージョン管理をサポートする .NET Framework 4 永続性データベースのアップグレード

SqlWorkflowInstanceStoreSchemaUpgrade.sql データベース スクリプトは、.NET Framework 4 データベース スクリプトを使用して作成された永続性データベースをアップグレードするために用意されています。 このスクリプトでは、.NET Framework 4.5 で導入された新しいバージョン管理機能をサポートするようにデータベースを更新します。 データベースで永続化されたすべてのワークフロー インスタンスは、既定のバージョン番号が付与されるため、side-by-side 実行および動的更新に参加できるようになります。

.NET Framework 4.5 ワークフロー アプリケーションで、提供されたスクリプトを使用してアップグレードされていない永続性データベースに対して新しいバージョン管理機能を使用する永続化操作が試行されると、InstancePersistenceCommandException がスローされ、次のようなメッセージが表示されます。

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

データベース スキーマをアップグレードするには

  1. SQL Server Management Studio を開き、永続性データベース サーバー ( .\SQLEXPRESS など) に接続します。

  2. [ファイル] メニューの [開く] をポイントし、 [ファイル] をクリックします。 次のフォルダーに移動します: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. SqlWorkflowInstanceStoreSchemaUpgrade.sql を選択して [開く] をクリックします。

  4. [使用できるデータベース] ボックスの一覧で、永続性データベースの名前を選択します。

  5. [クエリ] メニューの [実行] をクリックします。

クエリが完了すると、データベース スキーマがアップグレードされるため、必要に応じて、永続化されたワークフロー インスタンスに割り当てられた既定のワークフロー ID を確認できます。 オブジェクト エクスプローラー[データベース] ノードで永続性データベースを展開してから、 [ビュー] ノードを展開します。 System.Activities.DurableInstancing.Instances を右クリックして、 [上位 1000 行を選択] を選択します。 列の末尾までスクロールし、IdentityNameIdentityPackageBuildMajorMinorRevision の 6 つの列がビューに追加されていることを確認します。 すべての永続化されたワークフローでは、これらのフィールドに値 NULL が設定されており、null のワークフロー ID を表します。