Extensibilidade da Loja
SqlWorkflowInstanceStore Permite que os usuários promovam propriedades personalizadas e específicas do aplicativo que podem ser usadas para consultar instâncias no banco de dados de persistência. O ato de promover um imóvel faz com que o valor esteja disponível dentro de uma visualização especial no banco de dados. Essas propriedades promovidas (propriedades que podem ser usadas em consultas de usuário) podem ser de tipos simples, como Int64, Guid, String e DateTime ou de um tipo binário serializado (byte[]).
A SqlWorkflowInstanceStore classe tem o Promote método que você pode usar para promover uma propriedade como uma propriedade que pode ser usada em consultas. O exemplo a seguir é um exemplo de ponta a ponta de extensibilidade de armazenamento.
Neste cenário de exemplo, um aplicativo de processamento de documentos (DP) tem fluxos de trabalho, cada um dos quais usa atividades personalizadas para processamento de documentos. Esses fluxos de trabalho têm um conjunto de variáveis de estado que precisam ser tornadas visíveis para o usuário final. Para conseguir isso, o aplicativo DP fornece uma extensão de instância do tipo PersistenceParticipant, que é usada por atividades para fornecer as variáveis de estado.
class DocumentStatusExtension : PersistenceParticipant { public string DocumentId; public string ApprovalStatus; public string UserName; public DateTime LastUpdateTime; }
A nova extensão é então adicionada ao host.
static Activity workflow = CreateWorkflow(); WorkflowApplication application = new WorkflowApplication(workflow); DocumentStatusExtension documentStatusExtension = new DocumentStatusExtension (); application.Extensions.Add(documentStatusExtension);
Para obter mais detalhes sobre como adicionar um participante de persistência personalizado, consulte o Exemplo de participantes de persistência.
As atividades personalizadas no aplicativo DP preenchem vários campos de status no método 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(); // ... }
Quando uma instância de fluxo de trabalho atinge um ponto de persistência, o método CollectValues do participante da persistência DocumentStatusExtension salva essas propriedades na coleta de dados de persistência.
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; } // ... }
Nota
Todas essas propriedades são passadas para SqlWorkflowInstanceStore pela estrutura de persistência por meio da coleção SaveWorkflowCommand.InstanceData .
O aplicativo DP inicializa o SQL Workflow Instance Store e invoca o método Promote para promover esses dados.
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);
Com base nessas informações de promoção, SqlWorkflowInstanceStore coloca as propriedades de dados nas colunas da exibição InstancePromotedProperties .
Para consultar um subconjunto dos dados da tabela de promoções, o aplicativo DP adiciona uma exibição personalizada na parte superior da exibição de promoção.
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
Visualização [System.Activities.DurableInstancing.InstancePromotedProperties]
Nome da Coluna | Tipo de coluna | Description |
---|---|---|
InstanceId | GUID | A instância de fluxo de trabalho à qual esta promoção pertence. |
PromotionName | Nvarchar(400) | O nome da promoção em si. |
Valor1, Valor2, Valor3,..,Valor32 | sql_variant | O valor do próprio imóvel promovido. A maioria dos tipos de dados primitivos SQL, exceto blobs binários e cadeias de caracteres com mais de 8000 bytes de comprimento, pode caber em sql_variant. |
Valor33, Valor34, Valor35, ..., Valor64 | varbinário (máx.) | O valor das propriedades promovidas que são explicitamente declaradas como varbinary(max). |