存放區擴充性
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; } // ... }
注意
持續性架構會透過 SaveWorkflowCommand.InstanceData 集合,將上述所有屬性傳遞至 SqlWorkflowInstanceStore。
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 檢視的資料行中。
為了要查詢提升表中的資料子集,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 | 受提升之屬性本身的值。 Most SQL 基本資料型別 (長度超過 8000 位元組的二進位 Blob 和字串除外) 均適合 sql_variant。 |
Value33, Value34, Value35, …, Value64 | varbinary(max) | 明確宣告為 varbinary(max) 之受提升屬性的值。 |