共用方式為


商店擴充性

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);
    

    根據這項升級資訊, SqlWorkflowInstanceStore 會將數據屬性放在 InstancePromotedProperties 檢視的數據行中。

  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] 檢視

欄位名稱 欄位類型 說明
實例識別碼 GUID(國際唯一識別碼) 此升級所屬的工作流程實例。
促銷名稱 nvarchar(400) 促銷本身的名稱。
Value1、Value2、Value3,..,Value32 sql_variant (SQL資料型別變體) 升階屬性本身的值。 除了長度超過8000個字節的二進位 Blob 和字元串以外,大部分的 SQL 基本數據類型都可以容納在sql_variant中。
Value33、Value34、Value35、...、Value64 varbinary(max) 明確宣告為 varbinary(max) 之升級屬性的值。