Partilhar via


Usando WorkflowIdentity e Versionamento

WorkflowIdentity fornece uma forma para os desenvolvedores de aplicações de fluxo de trabalho associarem um nome e um Version a uma definição de fluxo de trabalho, permitindo que essas informações sejam relacionadas a uma instância de fluxo de trabalho persistente. Essas informações de identidade podem ser usadas por desenvolvedores de aplicativos de fluxo de trabalho para habilitar cenários como a execução lado a lado de várias versões de uma definição de fluxo de trabalho e fornecem a pedra angular para outras funcionalidades, como a atualização dinâmica. Este tópico fornece uma visão geral do uso de WorkflowIdentity com WorkflowApplication alojamento. Para obter informações sobre a execução lado a lado de definições de fluxo de trabalho em um serviço de fluxo de trabalho, consulte Controle de versão lado a lado em WorkflowServiceHost. Para obter informações sobre atualização dinâmica, consulte Atualização dinâmica.

Neste tópico

Usando WorkflowIdentity

Para usar WorkflowIdentity, crie uma instância, configure-a e associe-a a uma instância WorkflowApplication. Uma WorkflowIdentity instância contém três informações de identificação. Name e Version contêm um nome e um Version e são obrigatórios, e Package é opcional e pode ser usado para especificar uma cadeia de caracteres adicional contendo informações como nome do assembly ou outras informações desejadas. A WorkflowIdentity é único se qualquer uma das suas três propriedades for diferente de outra WorkflowIdentity.

Importante

A WorkflowIdentity não deve conter nenhuma informação pessoal identificável (PII). As informações sobre o WorkflowIdentity usado para criar uma instância são emitidas pelo runtime para qualquer serviço de rastreamento configurado em diferentes pontos do ciclo de vida da atividade. O WF Tracking não tem nenhum mecanismo para ocultar PII (dados confidenciais do usuário). Portanto, uma WorkflowIdentity instância não deve conter dados de PII, pois eles serão emitidos pelo tempo de execução nos registros de rastreamento e podem ser visíveis para qualquer pessoa com acesso para exibir os registros de rastreamento.

No exemplo a seguir, um WorkflowIdentity é criado e associado a uma instância de um fluxo de trabalho criado usando uma MortgageWorkflow definição de fluxo de trabalho.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

Ao recarregar e retomar um fluxo de trabalho, um WorkflowIdentity que esteja configurado para corresponder à WorkflowIdentity instância do fluxo de trabalho persistente deve ser usado.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the workflow.
wfApp.Load(instanceId);

// Resume the workflow...

Se o WorkflowIdentity usado ao recarregar a instância do fluxo de trabalho não corresponder ao WorkflowIdentity persistido, um VersionMismatchException será gerado. No exemplo a seguir, tenta-se carregar a instância MortgageWorkflow que foi persistida no exemplo anterior. Essa tentativa de carregamento é feita usando um WorkflowIdentity configurado para uma versão mais recente do fluxo de trabalho de hipoteca que não corresponde à instância persistente.

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow_v2(), identityV2);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Attempt to load the workflow instance.
wfApp.Load(instanceId);

// Resume the workflow...

Quando o código anterior é executado, o seguinte VersionMismatchException é lançado.

The WorkflowIdentity ('MortgageWorkflow v1; Version=1.0.0.0') of the loaded instance does not match the WorkflowIdentity ('MortgageWorkflow v2; Version=2.0.0.0') of the provided workflow definition. The instance can be loaded using a different definition, or updated using Dynamic Update.

Execução lado a lado usando WorkflowIdentity

WorkflowIdentity pode ser usado para facilitar a execução de várias versões de um fluxo de trabalho lado a lado. Um cenário comum é alterar os requisitos de negócios em um fluxo de trabalho de longa execução. Muitas instâncias de um fluxo de trabalho podem estar em execução quando uma versão atualizada é implantada. O aplicativo host pode ser configurado para usar a definição de fluxo de trabalho atualizada ao iniciar novas instâncias, e é responsabilidade do aplicativo host fornecer a definição de fluxo de trabalho correta ao retomar instâncias. WorkflowIdentity pode ser usado para identificar e fornecer a definição de fluxo de trabalho correspondente ao retomar instâncias de fluxo de trabalho.

Para recuperar a WorkflowIdentity instância de um fluxo de trabalho persistente, o GetInstance método é usado. O GetInstance método recebe a Id da instância de fluxo de trabalho persistente e a SqlWorkflowInstanceStore que contém a instância persistente e retorna um WorkflowApplicationInstance. A WorkflowApplicationInstance contém informações sobre uma instância de fluxo de trabalho persistente, incluindo seu associado WorkflowIdentity. Esse associado WorkflowIdentity pode ser usado pelo host para fornecer a definição correta do fluxo de trabalho ao carregar e retomar a instância do fluxo de trabalho.

Nota

Um WorkflowIdentity nulo é válido e pode ser utilizado pelo host para mapear instâncias que foram persistidas sem qualquer associação WorkflowIdentity à definição adequada de fluxo de trabalho. Esse cenário pode ocorrer quando um aplicativo de fluxo de trabalho não foi inicialmente escrito com controle de versão de fluxo de trabalho ou quando um aplicativo é atualizado do .NET Framework 4. Para obter mais informações, consulte Atualizando bancos de dados de persistência do .NET Framework 4 para dar suporte ao controle de versão do fluxo de trabalho.

No exemplo a seguir, a Dictionary<WorkflowIdentity, Activity> é usada para associar WorkflowIdentity instâncias às suas definições de fluxo de trabalho correspondentes, e um fluxo de trabalho é iniciado usando a definição de MortgageWorkflow fluxo de trabalho, que está associada ao identityV1WorkflowIdentity.

WorkflowIdentity identityV1 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v1",
    Version = new Version(1, 0, 0, 0)
};

WorkflowIdentity identityV2 = new WorkflowIdentity
{
    Name = "MortgageWorkflow v2",
    Version = new Version(2, 0, 0, 0)
};

Dictionary<WorkflowIdentity, Activity> WorkflowVersionMap = new Dictionary<WorkflowIdentity, Activity>();
WorkflowVersionMap.Add(identityV1, new MortgageWorkflow());
WorkflowVersionMap.Add(identityV2, new MortgageWorkflow_v2());

WorkflowApplication wfApp = new WorkflowApplication(new MortgageWorkflow(), identityV1);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Run the workflow.
wfApp.Run();

No exemplo a seguir, as informações sobre a instância de fluxo de trabalho persistente do exemplo anterior são recuperadas chamando GetInstance, e as informações persistentes WorkflowIdentity são usadas para recuperar a definição de fluxo de trabalho correspondente. Essas informações são usadas para configurar o WorkflowApplication, e, em seguida, o fluxo de trabalho é carregado. Observe que, como a Load sobrecarga que leva o WorkflowApplicationInstance é usada, o SqlWorkflowInstanceStore que foi configurado no WorkflowApplicationInstance é usado pelo WorkflowApplication e, portanto, sua InstanceStore propriedade não precisa ser configurada.

Nota

Se a InstanceStore propriedade estiver definida, ela deve ser definida com a mesma SqlWorkflowInstanceStore instância usada pelo WorkflowApplicationInstance ou então um ArgumentException será lançado com a seguinte mensagem: The instance is configured with a different InstanceStore than this WorkflowApplication..

// Get the WorkflowApplicationInstance of the desired workflow from the specified
// SqlWorkflowInstanceStore.
WorkflowApplicationInstance instance = WorkflowApplication.GetInstance(instanceId, store);

// Use the persisted WorkflowIdentity to retrieve the correct workflow
// definition from the dictionary.
Activity definition = WorkflowVersionMap[instance.DefinitionIdentity];

WorkflowApplication wfApp = new WorkflowApplication(definition, instance.DefinitionIdentity);

// Configure the WorkflowApplication with persistence and desired workflow event handlers.
ConfigureWorkflowApplication(wfApp);

// Load the persisted workflow instance.
wfApp.Load(instance);

// Resume the workflow...

Atualizando bancos de dados de persistência do .NET Framework 4 para dar suporte ao controle de versão do fluxo de trabalho

Um script de banco de dados SqlWorkflowInstanceStoreSchemaUpgrade.sql é fornecido para atualizar bancos de dados de persistência criados usando os scripts de banco de dados do .NET Framework 4. Esse script atualiza os bancos de dados para oferecer suporte aos novos recursos de controle de versão introduzidos no .NET Framework 4.5. Todas as instâncias de fluxo de trabalho persistentes nos bancos de dados recebem valores de controle de versão padrão e podem participar da execução lado a lado e da atualização dinâmica.

Se um aplicativo de fluxo de trabalho do .NET Framework 4.5 tentar qualquer operação de persistência que use os novos recursos de controle de versão em um banco de dados de persistência que não tenha sido atualizado usando o script fornecido, um InstancePersistenceCommandException será lançado com uma mensagem semelhante à mensagem a seguir.

The SqlWorkflowInstanceStore has a database version of '4.0.0.0'. InstancePersistenceCommand 'System.Activities.DurableInstancing.CreateWorkflowOwnerWithIdentityCommand' cannot be run against this database version.  Please upgrade the database to '4.5.0.0'.

Para atualizar o esquema do banco de dados

  1. Abra o SQL Server Management Studio e conecte-se ao servidor de banco de dados de persistência, por exemplo, .\SQLEXPRESS.

  2. Escolha Abrir, Ficheiro no menu Ficheiro. Navegue até a seguinte pasta: C:\Windows\Microsoft.NET\Framework\v4.0.30319\sql\en

  3. Selecione SqlWorkflowInstanceStoreSchemaUpgrade.sql e clique em Abrir.

  4. Selecione o nome do banco de dados de persistência no menu suspenso Available Databases.

  5. No menu Consulta, escolha Executar.

Quando a consulta é concluída, o esquema de banco de dados é atualizado e, se desejado, você pode exibir a identidade de fluxo de trabalho padrão que foi atribuída às instâncias de fluxo de trabalho persistentes. Expanda o seu banco de dados de persistência no nó Bancos de Dados do Explorador de Objetos e, em seguida, expanda o nó Vistas. Clique com o botão direito do mouse em System.Activities.DurableInstancing.Instances e escolha Select Top 1000 Rows. Role até o final das colunas e observe que há seis colunas adicionais adicionadas à exibição: IdentityName, IdentityPackage, Build, Major, Minor e Revision. Todos os fluxos de trabalho persistentes terão um valor NULL para esses campos, representando uma identidade de fluxo de trabalho nulo.