Repositórios de instâncias
Um armazenamento de instâncias é um contêiner lógico de instâncias. É o local onde os dados e metadados da instância são armazenados. Um armazenamento de instâncias não implica armazenamento físico dedicado. Um armazenamento de instâncias pode conter informações duráveis em um banco de dados do SQL Server ou informações de estado não duráveis em uma memória. O .NET Framework 4.6.1 é fornecido com o SQL Workflow Instance Store, que é uma implementação concreta de um repositório de instâncias que permite que os fluxos de trabalho persistam dados e metadados de instância em um banco de dados SQL Server 2005 ou SQL Server 2008. Além disso, o Windows Server App Fabric também fornece uma implementação concreta de um repositório de instâncias. Para obter mais informações, consulte Windows Server App Fabric Instance Store, Query and Control Providers.
A API de persistência é a interface entre um host e um armazenamento de instâncias que permite que o host envie solicitações de comando (por exemplo, LoadWorkflowCommand e SaveWorkflowCommand) para o repositório de instâncias. A implementação concreta dessa API é chamada de provedor de persistência. O provedor de persistência recebe solicitações de um host e modifica o armazenamento de instâncias.
Hosts e repositórios de instâncias são conectáveis para que um host possa ser usado com muitos repositórios de instâncias, e um armazenamento de instâncias possa ser usado com muitos hosts. Um armazenamento de instâncias normalmente é otimizado para os padrões de uso de um host específico, embora o armazenamento de instâncias e o host possam evoluir em ciclos de vida independentes. Por exemplo, o WorkflowServiceHost e o SqlWorkflowInstanceStore foram projetados para funcionar bem juntos. Você pode criar seu próprio armazenamento de instâncias para persistir dados e metadados de instâncias de serviço de fluxo de trabalho e usar esse armazenamento de instâncias com o WorkflowServiceHost. Por exemplo, você pode criar um OracleWorkflowInstanceStore que permite que os fluxos de trabalho persistam informações em um banco de dados Oracle em vez de salvá-las em um banco de dados SQL Server.
É comum que os hosts sejam estendidos com funcionalidade adicional que modifica os objetos persistentes. Por exemplo, um sistema de persistência de instância pode ter um host de fluxo de trabalho, uma extensão que ofereça suporte à operação "Suspender" e um armazenamento de instância SQL. O host do fluxo de trabalho pode enviar um comando padrão, como Salvar ou Carregar, para salvar ou carregar um fluxo de trabalho de um repositório de instâncias ou para salvar um fluxo de trabalho em um repositório de instâncias. A extensão suspend pode adicionar semântica adicional aos comandos para salvar e carregar instâncias de fluxo de trabalho para que uma instância de fluxo de trabalho suspensa não possa ser carregada. O provedor de persistência para o repositório de instâncias SQL compreende os comandos para salvar e carregar instâncias de fluxo de trabalho e implementa os comandos chamando procedimentos armazenados apropriados que alteram as tabelas de objetos persistentes em um banco de dados do SQL Server.
Um host atua como um proprietário de instância dentro de um armazenamento de instâncias. Um host pode atuar como mais de um proprietário de instância com mais de um armazenamento de instância ao mesmo tempo. O host fornece GUIDs para chaves de instância associadas às instâncias. Uma chave de instância é um alias exclusivo que identifica uma instância. O sistema de persistência cria, atualiza e exclui informações do proprietário da instância à medida que executa comandos solicitados pelos hosts.
A lista a seguir contém as etapas importantes envolvidas na interação do host com o armazenamento de instâncias:
Obtenha um InstanceStore de um provedor de persistência.
Obtenha o identificador para uma instância chamando o CreateInstanceHandle método no InstanceStore.
Invoque comandos contra o identificador de instância chamando o Execute método no InstanceStore.
Examine o InstanceView retornado por InstanceStore.Execute para determinar os resultados dos comandos.