次の方法で共有


ストアの機能拡張

SqlWorkflowInstanceStore を使用すると、永続化データベース内のインスタンスのクエリに使用できる、アプリケーション固有のカスタム プロパティを昇格させることができます。 プロパティを昇格すると、データベース内の特別なビュー内で値を使用できるようになります。 これらの昇格されたプロパティ (ユーザー クエリで使用できるプロパティ) には、 Int64GuidStringDateTime、シリアル化されたバイナリ型 (byte[]) などの単純な型を使用できます。

SqlWorkflowInstanceStore クラスには、プロパティをクエリで使用できるプロパティとして昇格するために使用できるPromote メソッドがあります。 次の例は、ストアの機能拡張のエンド ツー エンドの例です。

  1. このシナリオ例では、ドキュメント処理 (DP) アプリケーションにはワークフローがあり、それぞれがドキュメント処理にカスタム アクティビティを使用します。 これらのワークフローには、エンド ユーザーに表示する必要がある一連の状態変数があります。 これを実現するために、DP アプリケーションは PersistenceParticipant型のインスタンス拡張を提供します。これは、状態変数を提供するためにアクティビティによって使用されます。

    class DocumentStatusExtension : PersistenceParticipant
    {
        public string DocumentId;
        public string ApprovalStatus;
        public string UserName;
        public DateTime LastUpdateTime;
    }
    
  2. その後、新しい拡張機能がホストに追加されます。

    static Activity workflow = CreateWorkflow();
    WorkflowApplication application = new WorkflowApplication(workflow);
    DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension ();
    application.Extensions.Add(documentStatusExtension);
    

    カスタム永続化参加要素の追加の詳細については、 永続化参加者 のサンプルを参照してください。

  3. 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();
        // ...
    }
    
  4. ワークフロー インスタンスが永続化ポイントに達すると、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;
        }
        // ...
    }
    

    これらのプロパティはすべて、SaveWorkflowCommand.InstanceData コレクションを介して永続化フレームワークによって SqlWorkflowInstanceStore に渡されます。

  5. DP アプリケーションは、SQL ワークフロー インスタンス ストアを初期化し、 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);
    

    この昇格情報に基づいて、 SqlWorkflowInstanceStoreInstancePromotedProperties ビューの列にデータ プロパティを配置します。

  6. 昇格テーブルのデータのサブセットに対してクエリを実行するために、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] ビュー

列の名前 列の種類 説明
インスタンスID GUID(グローバルユニーク識別子) この昇格が属するワークフロー インスタンス。
プロモーション名 Nvarchar (400) 昇格自体の名前。
Value1、Value2、Value3,..,Value32 SQLバリアント 昇格されたプロパティ自体の値。 バイナリ BLOB と長さが 8,000 バイトを超える文字列を除くほとんどの SQL プリミティブ データ型は、sql_variantに収めることができます。
Value33、Value34、Value35、...、Value64 varbinary(max) varbinary(max) として明示的に宣言されている昇格されたプロパティの値。