Partilhar via


Usando WorkflowIdentity e versionamento

WorkflowIdentity Fornece uma maneira para os desenvolvedores de aplicativos de fluxo de trabalho associarem um nome e um Version a a uma definição de fluxo de trabalho e para que essas informações sejam associadas 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 como visão geral do uso WorkflowIdentity com WorkflowApplication hospedagem. 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 WorkflowIdentityo , crie uma instância, configure-a e associe-a a uma WorkflowApplication instância. 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 para qualquer serviço de rastreamento configurado em vários pontos diferentes do ciclo de vida da atividade pelo tempo de execução. 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 persistente WorkflowIdentity, a VersionMismatchException será lançado. No exemplo a seguir, uma tentativa de carregamento é feita na MortgageWorkflow instância 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 usa a Id da instância de fluxo de trabalho persistente e a SqlWorkflowInstanceStore que contém a instância persistente e retorna um WorkflowApplicationInstancearquivo . 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 nulo WorkflowIdentity é válido e pode ser usado pelo host para mapear instâncias que foram persistidas sem nenhuma associação WorkflowIdentity à definição de fluxo de trabalho adequada. 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 identityV1 WorkflowIdentity.

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 e, em WorkflowApplicationseguida, 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, Arquivo no menu Arquivo. 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 na lista suspensa Bancos de dados disponíveis.

  5. Escolha Executar no menu Consulta .

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 seu banco de dados de persistência no nó Bancos de Dados do Pesquisador de Objetos e, em seguida, expanda o nó Exibições. 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.