ストア拡張
SqlWorkflowInstanceStore を使用して、永続性データベースのインスタンスをクエリする場合に使用できるカスタムのアプリケーション固有のプロパティを昇格できます。 プロパティを昇格することで、データベース内の特殊なビュー内で値が使用できるようになります。 これらの昇格したプロパティ (ユーザー クエリで使用できるプロパティ) は、単純型 (Int64、Guid、String、DateTime など) またはシリアル化されたバイナリ型 (byte[]) になる場合があります。
SqlWorkflowInstanceStore クラスには Promote メソッドがあり、クエリで使用できるプロパティとしてプロパティを昇格するために使用できます。 次の例は、ストア拡張のエンド ツー エンドの例です。
この例のシナリオでは、ドキュメント処理 (DP) アプリケーションにワークフローがあり、それぞれがドキュメント処理にカスタム アクティビティを使用しています。 これらのワークフローは、エンド ユーザーから見える必要がある一連の状態変数を備えています。 これを実現するために、DP アプリケーションには PersistenceParticipant 型を持つインスタンス拡張機能があり、状態変数を提供するアクティビティによって使用されます。
class DocumentStatusExtension : PersistenceParticipant { public string DocumentId; public string ApprovalStatus; public string UserName; public DateTime LastUpdateTime; }
次に、新しい機能拡張がホストに追加されます。
static Activity workflow = CreateWorkflow(); WorkflowApplication application = new WorkflowApplication(workflow); DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension (); application.Extensions.Add(documentStatusExtension);
カスタムの永続参加要素の追加の詳細については、「永続参加要素」のサンプルを参照してください。
DP アプリケーションのカスタム アクティビティでは、Execute メソッドでさまざまな状態フィールドを設定します。
public override void Execute(CodeActivityContext context) { // ... context.GetExtension<DocumentStatusExtension>().DocumentId = Guid.NewGuid(); context.GetExtension<DocumentStatusExtension>().UserName = "John Smith"; context.GetExtension<DocumentStatusExtension>().ApprovalStatus = "Approved"; context.GetExtension<DocumentStatusExtension>().LastUpdateTime = DateTime.Now(); // ... }
ワークフロー インスタンスが永続性ポイントに達すると、DocumentStatusExtension 永続参加要素の CollectValues メソッドによって、これらのプロパティが永続性データ コレクションに保存されます。
class DocumentStatusExtension : PersistenceParticipant { const XNamespace xNS = XNamespace.Get("http://contoso.com/DocumentStatus"); protected override void CollectValues(out IDictionary<XName, object> readWriteValues, out IDictionary<XName, object> writeOnlyValues) { readWriteValues = new Dictionary<XName, object>(); readWriteValues.Add(xNS.GetName("UserName"), this.UserName); readWriteValues.Add(xNS.GetName("ApprovalStatus"), this.ApprovalStatus); readWriteValues.Add(xNS.GetName("DocumentId"), this.DocumentId); readWriteValues.Add(xNS.GetName("LastModifiedTime"), this.LastUpdateTime); writeOnlyValues = null; } // ... }
Note
これらのプロパティはすべて、SaveWorkflowCommand.InstanceData コレクションを介して、永続化フレームワークによって SqlWorkflowInstanceStore に渡されます。
DP アプリケーションによって SQL Workflow Instance Store が初期化され、このデータを昇格するための Promote メソッドが呼び出されます。
SqlWorkflowInstanceStore store = new SqlWorkflowInstanceStore(connectionString); List<XName> variantProperties = new List<XName>() { xNS.GetName("UserName"), xNS.GetName("ApprovalStatus"), xNS.GetName("DocumentId"), xNS.GetName("LastModifiedTime") }; store.Promote("DocumentStatus", variantProperties, null);
この昇格情報に基づいて、SqlWorkflowInstanceStore では InstancePromotedProperties ビューの列にデータ プロパティを設定します。
昇格テーブルのデータのサブセットを照会するために、DP アプリケーションによって昇格ビューの上にカスタマイズされたビューが追加されます。
create view [dbo].[DocumentStatus] with schemabinding as select P.[InstanceId] as [InstanceId], P.Value1 as [UserName], P.Value2 as [ApprovalStatus], P.Value3 as [DocumentId], P.Value4 as [LastUpdatedTime] from [System.Activities.DurableInstancing].[InstancePromotedProperties] as P where P.PromotionName = N'DocumentStatus' go
[System.Activities.DurableInstancing.InstancePromotedProperties] ビュー
列名 | 列の型 | 説明 |
---|---|---|
InstanceId | GUID | この昇格が属するワークフロー インスタンス。 |
PromotionName | nvarchar(400) | 昇格自体の名前。 |
Value1、Value2、Value3、…Value32 | sql_variant | 昇格したプロパティ自体の値。 ほとんどの SQL プリミティブ データ型はバイナリ ブロブを除外し、長さが 8,000 バイトを超える文字列は sql_variant に合わせて短縮されます。 |
Value33、Value34、Value35、…、Value64 | varbinary(max) | varbinary(max) として明示的に宣言される昇格したプロパティの値。 |
.NET