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] 视图
列名 | 列名称 | DESCRIPTION |
---|---|---|
实例ID | GUID | 此晋升所隶属的工作流实例。 |
促销名称 | nvarchar(400) | 提升本身的名称。 |
Value1、Value2、Value3,..,Value32 | SQL变体 | 已提升属性本身的值。 除二进制 blob 和长度超过 8000 字节的字符串外,大多数 SQL 基元数据类型可以容纳在sql_variant中。 |
Value33、Value34、Value35、...、Value64 | varbinary(max) | 显式声明为 varbinary(max) 的已提升属性的值。 |